题意:这道题主要给你一张图,然后让你输出一个矩阵,表示从i->j有多少种路径数, 若是有无限种边输出-1。
思路:用floyd算法在求解的时候稍微改装一下Map[i][j] +=Map[i][k]*Map[k][j]在最后求出来的时候,看一下Map[i]][i]是不是为零。若不是这说明这一点在环上那经过这一点的所有路径就是无限长的。
这样的话就把所有经过i的点更新一下就行了。
代码如下:
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cstdlib> 5 #include <algorithm> 6 #include <queue> 7 #include <stack> 8 #include <vector> 9 #include <utility> 10 #define LEN 1010 11 #define INF 500001 12 #define ll long long 13 14 using namespace std; 15 16 int Map[LEN][LEN], n, cnt = 0; 17 18 void floyd() 19 { 20 for(int k=0; k<n; k++){ 21 for(int i=0; i<n; i++){ 22 for(int j=0; j<n; j++){ 23 Map[i][j] += Map[i][k]*Map[k][j]; 24 } 25 } 26 } 27 for(int k=0; k<n; k++){ 28 if(Map[k][k]){ 29 for(int i=0; i<n; i++){ 30 for(int j=0; j<n; j++){ 31 if(Map[i][k] && Map[k][j])Map[i][j] = -1; 32 } 33 } 34 } 35 } 36 } 37 38 int main() 39 { 40 // freopen("in.txt", "r", stdin); 41 42 int dn; 43 while(scanf("%d", &dn)!=EOF){ 44 memset(Map, 0, sizeof Map); 45 n = 0; 46 for(int i=0; i<dn; i++){ 47 int a, b; 48 scanf("%d%d", &a, &b); 49 Map[a][b] = 1; 50 n = max(n ,max(a, b)); 51 } 52 n++; 53 floyd(); 54 printf("matrix for city %d ", cnt++); 55 for(int i=0; i<n; i++){ 56 for(int j=0; j<n; j++){ 57 printf("%d", Map[i][j]); 58 if(j!=n-1)printf(" "); 59 } 60 printf(" "); 61 } 62 } 63 return 0; 64 }