hdu 1625(floyd判环)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1625

思路:大牛说是floyd判环,一想确实如此,我还一直在想如果用记忆化的怎么处理环呢...orz....

首先通过Floyd预处理,把所有的路径数求出来,即d[i][j] += d[i][k] * d[k][j]。然后确定有无环,如果存在环的话,即d[k][k] != 0(存在环),那么所有的点i,j,只要经过了k(i->k->j),那么它的路径数是不能确定的,反之,确定。

View Code
 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 using namespace std;
 5 #define MAXN 55
 6 int path[MAXN][MAXN];
 7 int m,n;
 8 
 9 void floyd(){
10     for(int k=0;k<=n;k++){
11         for(int i=0;i<=n;i++){
12             for(int j=0;j<=n;j++){
13                 path[i][j]+=path[i][k]*path[k][j];
14             }
15         }
16     }
17     for(int i=0;i<=n;i++)if(path[i][i]){
18         path[i][i]=-1;
19         for(int j=0;j<=n;j++){
20             for(int k=0;k<=n;k++){
21                 if(path[j][i]&&path[i][k]){
22                     path[j][k]=-1;
23                 }
24             }
25         }
26     }
27 }
28 
29 int main(){
30     int u,v,t=0;
31     while(~scanf("%d",&m)){
32         memset(path,0,sizeof(path));
33         n=0;
34         for(int i=1;i<=m;i++){
35             scanf("%d%d",&u,&v);
36             path[u][v]=1;
37             n=max(n,max(u,v));
38         }
39         printf("matrix for city %d\n",t++);
40         floyd();
41         for(int i=0;i<=n;i++){
42             for(int j=0;j<n;j++){
43                 printf(" %d",path[i][j]);
44             }
45             printf(" %d\n",path[i][n]);
46         }
47     }
48     return 0;
49 }
原文地址:https://www.cnblogs.com/wally/p/3072575.html