uva 125(变形floyd)

题意:这道题主要给你一张图,然后让你输出一个矩阵,表示从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 }
View Code
奔跑吧!少年!趁着你还年轻
原文地址:https://www.cnblogs.com/shu-xiaohao/p/3470838.html