标签:print blog mil out size 实例 复杂 ace none
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.
这是一道无向图最小环的模板题。看来我不会的还有挺多的啊。。。
无向图最小环就是在一张无向图当中,找出一个点数大于等于3的简单环,其权值最小。
这个方法还是比较巧妙的,用floyd相当于动归思想O(n^3)的复杂度算出来(路径也可算)。
如果用dij则要O(n^4)。
这。。应该算是一个模板吧。
唯一要说的,就是这题三个值相加,0x3f3f3f3f*3会爆int。
code:
1 #include<bits/stdc++.h> 2 #define Ms(a,x) memset(a,x,sizeof a) 3 using namespace std; 4 const int N=111; 5 int n,m,w[N][N],f[N][N],ans; 6 int main() { 7 while (scanf("%d%d",&n,&m)!=EOF) { 8 Ms(w,26),Ms(f,26),ans=f[0][0]; 9 for (int i=1,x,y,z; i<=m; i++) { 10 scanf("%d%d%d",&x,&y,&z); 11 w[x][y]=z<w[x][y]?z:w[x][y],w[y][x]=w[x][y]; 12 } 13 for (int i=1; i<=n; i++) 14 for (int j=1; j<=n; j++) f[i][j]=w[i][j]; 15 for (int k=1; k<=n; k++) { 16 for (int i=1; i<k; i++) 17 for (int j=i+1; j<k; j++) 18 ans=min(ans,f[i][j]+w[i][k]+w[k][j]); 19 for (int i=1; i<=n; i++) 20 for (int j=1; j<=n; j++) 21 f[i][j]=min(f[i][j],f[i][k]+f[k][j]); 22 } 23 if (ans<f[0][0]) printf("%d\n",ans); 24 else puts("It‘s impossible."); 25 } 26 return 0; 27 }
[hdu P1599] find the mincost route
标签:print blog mil out size 实例 复杂 ace none
原文地址:http://www.cnblogs.com/whc200305/p/7711652.html