路径还原(求两个点之间最短距离的路径)
思路:其实就是加一个pre数组,用来存当前顶点的前一个顶点的值。
看代码
#include<iostream> #include<cstdio> #include<cstring> #include<stdio.h> #include<string.h> #include<cmath> #include<math.h> #include<algorithm> #include<set> #include<queue> #include<map> typedef long long ll; using namespace std; const ll mod=1e9+7; const int maxn=1e3+10; const int maxk=100+10; const int maxx=1e4+10; const ll maxe=1000+10; #define INF 0x3f3f3f3f3f3f ll v,e; ll cost[maxn][maxn]; ll d[maxn]; ll pre[maxn]; bool vis[maxn]; void solve(int s) { d[s]=0; while(true) { int flag=-1; for(int i=0;i<v;i++) { if(!vis[i]&&(flag==-1||d[i]<d[flag])) flag=i; } if(flag==-1) break; vis[flag]=true; for(int i=0;i<v;i++) { if(d[i]>d[flag]+cost[flag][i]) { d[i]=d[flag]+cost[flag][i]; pre[i]=flag; } } } } //到顶点t的最短路径 vector<int> get_path(int t) { vector<int> path; for(;t!=-1;t=pre[t]) { path.push_back(t); } reverse(path.begin(),path.end());//这样得到的顺序是从t到s的,所以翻转之 return path; } int main() { ios::sync_with_stdio(false); cin>>v>>e; memset(vis,false,sizeof(vis)); for(int i=0;i<v;i++) { for(int j=0;j<v;j++) cost[i][j]=INF; cost[i][i]=0; d[i]=INF; pre[i]=-1; } int a,b,va; for(int i=0;i<e;i++) { cin>>a>>b>>va; cost[a][b]=va; } solve(0); vector<int> ans=get_path(v-1); /* for(int i=0;i<ans.size();i++)//这是另一种输出 { cout<<ans[i]<<" "; } cout<<endl;*/ for(vector<int>::iterator i=ans.begin();i!=ans.end();i++) { cout<<*i; } return 0; }
当初的梦想实现了吗,事到如今只好放弃吗~