Floyd求最小环 HDU1599

 
杭州有N个景区,景区之间有一些双向的路来连接,现在8600想找一条旅游路线,
这个路线从A点出发并且最后回到A点,假设经过的路线为V1,V2,....VK,V1,那么必须满足K>2,
就是说至除了出发点以外至少要经过2个其他不同的景区,而且不能重复经过同一个景区。现在8600需要你帮他找一条这样的路线,
并且花费越少越好。 

Input第一行是2个整数N和M(N <= 100, M <= 1000),代表景区的个数和道路的条数。 
接下来的M行里,每行包括3个整数a,b,c.代表a和b之间有一条通路,并且需要花费c元(c <= 100)。Output对于每个测试实例,如果能找到这样一条路线的话,输出花费的最小值。如果找不到的话,输出"It's impossible.".

Sample Input

3 3
1 2 1
2 3 1
1 3 1
3 3
1 2 1
1 2 3
2 3 1

Sample Output

3
It's impossible.

题解代码
 1 #include<iostream>
 2 #include<algorithm>
 3 #include<string>
 4 #include<cmath>
 5 #include<cstring>
 6 #include<set>
 7 #include<map>
 8 #include<queue>
 9 #include<time.h>
10 using namespace std; 
11 typedef long long ll;
12 const int maxn = 100000;
13 const int mod = 1e9+7;
14 #define pb push_back
15 const int INF = 100000000;
16 using namespace std;
17 int mp[150][150];
18 int dis[150][150];
19 int n,m;
20 int ans ;
21 void init()
22 {
23     for(int i=0;i<=n;i++)
24     {
25         for(int j=0;j<=n;j++)
26         {
27             mp[i][j] = INF;
28             dis[i][j]  = INF;
29         }
30     } 
31 }
32 int main()
33 {
34     
35     while(~scanf("%d%d",&n,&m))
36     {
37         //memset(mp,INF,sizeof(mp));
38         //memset(dis,INF,sizeof(dis));
39         for(int i=0;i<m;i++)
40         {
41             int u,v,w;
42             cin>>u>>v>>w;
43             if(w < mp[u][v])
44             {
45                 mp[u][v] =  mp[v][u]  = w;
46                 dis[u][v] = dis[v][u] = w;
47             }
48         }
49         ans = INF;
50         for(int k= 1;k<=n;k++)
51         {
52             for(int i=1;i<k;i++)
53             {
54                 for(int j= i+1;j<k;j++)
55                     ans = min(ans, dis[i][j] + mp[i][k]+ mp[k][j]);
56             }
57 
58             for(int i = 1;i<=n;i++)
59             {
60                 for(int j= 1;j<=n;j++)
61                 {
62                     dis[i][j] = min(dis[i][k] + dis[k][j] , dis[i][j]);
63                 }
64             }
65         }   
66 
67         if(ans<INF)
68         {
69             cout<<ans<<endl;
70         }
71         else
72         {
73             cout<<"It's impossible."<<endl;
74         }
75     }
76 
77     //system("pause");
78 }
View Code

 

中途发现memset对二维数组重置的问题

使用memset对dis 和 mp 清空时会 WA;

此问题待解决

 

 

 

 

 
posted @ 2020-10-14 16:48  Wh1te  阅读(66)  评论(0编辑  收藏  举报