题目链接: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 }