UVA 125 Numbering Paths

UVA_125

    由于a->b的路径条数等于a->i与i->b的路径条数的乘积之和,因此在用floyd的过程中我们就可以算出a->b之间的路径条数,同时,如果a->b有无线条路径的话,那么一定存在a->b路径上的某点k使得f[k][k]!=0的。

#include<string.h>
#include<stdio.h>
#define MAXD 110
int M, N, f[MAXD][MAXD];
void init()
{
int i, j, a, b;
N = 0;
memset(f, 0, sizeof(f));
for(i = 0; i < M; i ++)
{
scanf("%d%d", &a, &b);
f[a][b] = 1;
if(a > N)
N = a;
if(b > N)
N = b;
}
}
void solve()
{
int i, j, k;
for(k = 0; k <= N; k ++)
for(i = 0; i <= N; i ++)
for(j = 0; j <= N; j ++)
if(f[i][k] && f[k][j])
f[i][j] += f[i][k] * f[k][j];
for(k = 0; k <= N; k ++)
if(f[k][k])
{
for(i = 0; i <= N; i ++)
for(j = 0; j <= N; j ++)
if(f[i][k] && f[k][j])
f[i][j] = -1;
}
for(i = 0; i <= N; i ++)
{
for(j = 0; j <= N; j ++)
{
if(j)
printf(" ");
printf("%d", f[i][j]);
}
printf("\n");
}
}
int main()
{
int t = 0;
while(scanf("%d", &M) == 1)
{
init();
printf("matrix for city %d\n", t ++);
solve();
}
return 0;
}
原文地址:https://www.cnblogs.com/staginner/p/2223456.html