题目链接
1 #include <cstdio>
2 #include <string>
3 #include <cstring>
4 #include <queue>
5 #include <map>
6 #include <algorithm>
7 using namespace std;
8 #define LL __int64
9 #define MOD 1000000007
10 #define INF 0xffffff
11 int dp[101][101],g[101][101],pre[101][101];
12 int ans[1001];
13 int main()
14 {
15 int n,m,minz,i,j,k,sv,ev,w,num,temp;
16 while(scanf("%d%d",&n,&m)!=EOF)
17 {
18 memset(pre,-1,sizeof(pre));
19 for(i = 1; i <= n; i ++)
20 {
21 for(j = 1; j <= n; j ++)
22 dp[i][j] = g[i][j] = INF;
23 dp[i][i] = g[i][i] = 0;
24 }
25 for(i = 1; i <= m; i ++)
26 {
27 scanf("%d%d%d",&sv,&ev,&w);
28 g[sv][ev] = dp[sv][ev] = min(dp[sv][ev],w);
29 g[ev][sv] = dp[ev][sv] = min(dp[ev][sv],w);
30 pre[sv][ev] = ev;
31 pre[ev][sv] = sv;
32 }
33 minz = INF;
34 for(i = 1; i <= n; i ++)//求最小环
35 {
36 for(j = 1; j <= i-1; j ++)
37 for(k = j+1; k <= i-1; k ++)
38 {
39 if(minz > dp[j][k] + g[j][i] + g[i][k])
40 {
41 minz = dp[j][k] + g[j][i] + g[i][k];
42 num = 1;
43 ans[0] = i;
44 temp = j;
45 while(temp != -1)
46 {
47 ans[num++] = temp;
48 temp = pre[temp][k];
49 }
50 }
51 }
52 for(j = 1; j <= n; j ++)
53 for(k = 1; k <= n; k ++)
54 {
55 if(dp[j][k] > dp[j][i] + dp[i][k])
56 {
57 dp[j][k] = dp[j][i] + dp[i][k];
58 pre[j][k] = pre[j][i];
59 }
60 }
61 }
62 if(minz == INF)
63 printf("No solution.
");
64 else
65 {
66 for(i = 0;i < num;i ++)
67 {
68 if(i == 0)
69 printf("%d",ans[i]);
70 else
71 printf(" %d",ans[i]);
72 }
73 }
74 printf("
");
75 }
76 return 0;
77 }