Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <cstdlib>
- #include <cstdio>
- #include <vector>
- #define get(i) scanf("%d",&i);
- using namespace std;
- const int maxn = 101;
- int edge[maxn][maxn];
- int parent[maxn];
- bool used[maxn];
- const int inf = 1<<30;
- int n ,m;
- int dijkstra(int from,int to)
- {
- int d[maxn],mind,mini;
- for(int i= 0;i<=n;i++)
- d[i]=(i==from)?0:inf;
- memset(used,false,sizeof(used));
- memset(parent,0,sizeof(parent));
- for(int i = 1;i<=n;i++)
- {
- mind = inf;mini = 0;
- for(int j = 1;j<=n;j++)
- {
- if(!used[j] && (mind>d[j]))
- {
- mind = d[j];mini = j;
- }
- }
- if(mind == inf)return d[to];
- used[mini]=true;
- for(int j = 1;j<=n;j++)
- {
- if(!used[j] && d[j]>d[mini]+edge[mini][j])
- {
- d[j]=d[mini]+edge[mini][j];
- parent[j]=mini;
- }
- }
- }
- return d[to];
- }
- int path[maxn];
- int pathsize;
- int main()
- {
- freopen("input.txt","r",stdin);
- freopen("output.txt","w",stdout);
- int a,b,w;
- cin>>n;
- while(n!=-1)
- {
- cin>>m;
- for(int i = 1;i<=n;i++)
- for(int j = 1;j<=n;j++)
- edge[i][j]=inf;
- int ans = inf;
- for(int i = 0;i<m;i++)
- {
- get(a);get(b);get(w);
- if(edge[a][b]>w)
- edge[a][b]=edge[b][a]=w;
- for(int j = 1;j<=n;j++)
- for(int k = j+1;k<=n;k++)
- {
- if(edge[j][k] == inf)continue;
- int cur= edge[j][k];
- edge[j][k]=edge[k][j] = inf;
- int curans = cur+dijkstra(j,k);
- if(ans>curans)
- {
- ans = curans;
- pathsize = 0;
- int r = k;
- while(r)
- {
- path[pathsize++]=r;
- r = parent[r];
- }
- }
- edge[j][k]=edge[k][j] = cur;
- }
- }
- if(ans == inf)
- {
- cout<<"No solution.\n";
- }
- else
- {
- for(int i = pathsize-1;i>=0;i--)
- {
- cout<<path[i];
- if(i!=0)cout<<" ";
- }
- cout<<endl;
- }
- cin>>n;
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment