最短路+最长路+最短路输出路径
1.spfa最短路
#include<iostream> #include<algorithm> #include<queue> #include<cstring> using namespace std; const int maxn=1e5+100; typedef pair<int,int>PII; vector<PII>e[maxn]; int vis[maxn]; int dis[maxn]; int cnt[maxn]; void spfa(){ queue<int>q; memset(dis,0x3f,sizeof(dis)); memset(vis,0,sizeof(vis)); memset(cnt,0,sizeof(cnt)); dis[1]=0; q.push(1); vis[1]=1; while(!q.empty()){ int u=q.front(); q.pop(); vis[u]=0; for(int i=0;i<e[u].size();i++){ int v=e[u][i].first; int w=e[u][i].second; if(dis[v]>dis[u]+w){ dis[v]=dis[u]+w; if(!vis[v]){ vis[v]=1; q.push(v); } } } } } int main(){ int n,m; cin>>n>>m; int u,v,w; for(int i=1;i<=m;i++){ cin>>u>>v>>w; e[u].push_back({v,w}); e[v].push_back({u,w}); } spfa(); if(dis[n]==0x3f3f3f3f){ cout<<"impossible"<<endl; } else{ cout<<dis[n]<<endl; } } /* #include<iostream> #include<algorithm> #include<queue> #include<cstring> using namespace std; const int maxn=1e5+100; typedef pair<int,int>PII; struct node{ int to; int ne; int w; }e[maxn]; int vis[maxn]; int dis[maxn]; int cnt; int head[maxn]; void add(int u,int v,int w){ e[cnt].to=v; e[cnt].ne=head[u]; e[cnt].w=w; head[u]=cnt++; } void spfa(){ queue<int>q; memset(dis,0x3f,sizeof(dis)); memset(vis,0,sizeof(vis)); dis[1]=0; q.push(1); vis[1]=1; while(!q.empty()){ int u=q.front(); q.pop(); vis[u]=0; for(int i=head[u];~i;i=e[i].ne){ int v=e[i].to; int w=e[i].w; if(dis[v]>dis[u]+w){ dis[v]=dis[u]+w; if(!vis[v]){ vis[v]=1; q.push(v); } } } } } int main(){ int n,m; cin>>n>>m; int u,v,w; memset(head,-1,sizeof(head)); for(int i=1;i<=m;i++){ cin>>u>>v>>w; add(u,v,w); add(v,u,w); } spfa(); if(dis[n]==0x3f3f3f3f){ cout<<"impossible"<<endl; } else{ cout<<dis[n]<<endl; } } */
2.spfa最长路
其实就是改了一个大于小于号
#include<iostream> #include<algorithm> #include<queue> #include<cstring> using namespace std; const int maxn=1e5+100; typedef pair<int,int>PII; struct node{ int to; int ne; int w; }e[maxn]; int vis[maxn]; int dis[maxn]; int cnt; int head[maxn]; int n,m; void add(int u,int v,int w){ e[cnt].to=v; e[cnt].ne=head[u]; e[cnt].w=w; head[u]=cnt++; } void spfa(){ queue<int>q; for(int i=1;i<=n;i++){ dis[i]=-0x3f3f3f3f; } memset(vis,0,sizeof(vis)); dis[1]=0; q.push(1); vis[1]=1; while(!q.empty()){ int u=q.front(); q.pop(); vis[u]=0; for(int i=head[u];~i;i=e[i].ne){ int v=e[i].to; int w=e[i].w; if(dis[v]<dis[u]+w){ dis[v]=dis[u]+w; if(!vis[v]){ vis[v]=1; q.push(v); } } } } } int main(){ cin>>n>>m; int u,v,w; memset(head,-1,sizeof(head)); for(int i=1;i<=m;i++){ cin>>u>>v>>w; add(u,v,w); } spfa(); if(dis[n]==-0x3f3f3f3f){ cout<<"-1"<<endl; } else{ cout<<dis[n]<<endl; } }
最短路输出路径:
#include<iostream> #include<algorithm> #include<queue> #include<cstring> #include<stack> using namespace std; const int maxn=1e5+100; typedef pair<int,int>PII; struct node{ int to; int ne; int w; }e[maxn]; int vis[maxn]; int dis[maxn]; int cnt; int head[maxn]; int pre[maxn]; void add(int u,int v,int w){ e[cnt].to=v; e[cnt].ne=head[u]; e[cnt].w=w; head[u]=cnt++; } void spfa(int s){ queue<int>q; memset(pre,-1,sizeof(pre)); memset(dis,0x3f,sizeof(dis)); memset(vis,0,sizeof(vis)); dis[s]=0; q.push(s); vis[s]=1; while(!q.empty()){ int u=q.front(); q.pop(); vis[u]=0; for(int i=head[u];~i;i=e[i].ne){ int v=e[i].to; int w=e[i].w; if(dis[v]>dis[u]+w){ dis[v]=dis[u]+w; pre[v]=u; if(!vis[v]){ vis[v]=1; q.push(v); } } } } } int main(){ int n,m; cin>>n>>m; int u,v,w; memset(head,-1,sizeof(head)); for(int i=1;i<=m;i++){ cin>>u>>v>>w; add(u,v,w); add(v,u,w); } int s,e; while(cin>>s>>e){ spfa(s); if(dis[e]==0x3f3f3f3f){ cout<<"impossible"<<endl; } else{ cout<<dis[e]<<endl; } stack<int>path; path.push(e); int now=pre[e]; while(1){ path.push(now); if(now==s){ break; } now=pre[now]; } printf("从%d到%d最优路线 : %d", s, e, s); path.pop(); while(!path.empty()){ printf("--->%d",path.top()); path.pop(); } printf("\n"); printf("最小花费:%d\n",dis[e]); } }