POJ 1734 Sightseeing trip(无向图最小环+输出路径)

题目链接

 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.\n");
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("\n");
75     }
76     return 0;
77 }

 

转载于:https://www.cnblogs.com/naix-x/p/3247486.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值