题目的意思就是给出有几条单向路,然后每条路是从哪到哪.
问任意两座城市有几种路线.(城市的数量要根据输入的边来出现,就是输入边时出现的最大的那个,就是城市数量)
如果有无数种路那么就输出-1.
i 到 j 有无数种路,说明从i 到 j 经过某一个点,而这个点是属于一个环的.
例如1 到 4 有边的是1 - 2 , 2 - 3 , 3 - 2 ,3 - 4;
那么1到4 就可以1-2-3-2-3-2-3-2.....-3-4;
所以首先是用floyd的变形求出任意两点的录得数量.
其中的松弛操作是
if(g[i][k] && g[k][j]) {
g[i][j] += g[i][k] * g[k][j];
}
那么如果g[k][k] != 0 ;说明k点属于环中的点,那么所有经过k的都变成-1.
AC代码:
#include<stdio.h>
#include<string.h>
const int N = 35;
int g[N][N];
int n;
int m;
void floyd () {
for (int k = 0 ; k <= m ;k++) {
for (int i = 0 ; i <= m ;i++) {
for (int j = 0 ; j <= m ;j++) {
if(g[i][k] && g[k][j]) {
g[i][j] += g[i][k] * g[k][j];
}
}
}
}
for (int k = 0 ; k <= m ;k++) {
if (g[k][k]) {
g[k][k] = -1;
for (int i = 0 ; i <= m ;i++) {
for (int j = 0 ; j <= m ;j++) {
if (g[i][k] && g[k][j])
g[i][j] = -1;
}
}
}
}
for (int i = 0 ; i <= m ;i++) {
for (int j = 0 ; j <= m ;j++) {
if (j != 0)
printf(" ");
printf("%d",g[i][j]);
}
printf("\n");
}
}
int main () {
int t = 0;
int a,b;
while(scanf("%d",&n) != EOF) {
m = 0;
memset(g, 0 ,sizeof(g));
for (int i = 0 ; i < n ;i++) {
scanf("%d%d",&a,&b);
int temp = a > b ? a : b;
m = temp > m ? temp : m;
g[a][b] = 1;
}
printf("matrix for city %d\n",t++);
floyd();
}
}