大意:让你求一个城市到另一个城市的路径的条数。
思路:Floyd变形,关键是确定有无环。首先通过Floyd预处理,把所有的路径数求出来,d[i][j] += d[i][k]*d[k][j],然后确定有无环,如果存在环的话,即d[k][k] != 0(存在环),那么所有的点i,j,只要经过了k(i->k->j),那么它的路径数是不能确定的,反之,确定。
CODE:
#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <cstring>
using namespace std;
#define MAXN 1010
int d[MAXN][MAXN];
int n, m;
void init()
{
n = -1;
memset(d, 0, sizeof(d));
}
void Floyd()
{
for(int k = 0; k <= n; k++)
for(int i = 0; i <= n; i++)
for(int j = 0 ; j <= n; j++)
d[i][j] = d[i][j] + (d[i][k] * d[k][j]);
for(int k = 0; k <= n; k++) if(d[k][k])
{
d[k][k] = -1;
for(int i = 0; i <= n; i++)
{
for(int j = 0; j <= n; j++)
{
if(d[i][k] && d[k][j])
{
d[i][j] = -1;
}
}
}
}
}
void output()
{
for(int i = 0; i <= n; i++)
{
for(int j = 0; j <= n; j++)
{
printf(j != n?"%d ":"%d\n", d[i][j]);
}
}
}
int main()
{
int times = 0;
while(~scanf("%d", &m))
{
init();
while(m--)
{
int u, v;
scanf("%d%d", &u, &v);
d[u][v] = 1;
n = max(n, max(u, v));
}
Floyd();
printf("matrix for city %d\n", times++);
output();
}
return 0;
}
#include <cstdlib>
#include <cstdio>
#include <cstring>
using namespace std;
#define MAXN 1010
int d[MAXN][MAXN];
int n, m;
void init()
{
n = -1;
memset(d, 0, sizeof(d));
}
void Floyd()
{
for(int k = 0; k <= n; k++)
for(int i = 0; i <= n; i++)
for(int j = 0 ; j <= n; j++)
d[i][j] = d[i][j] + (d[i][k] * d[k][j]);
for(int k = 0; k <= n; k++) if(d[k][k])
{
d[k][k] = -1;
for(int i = 0; i <= n; i++)
{
for(int j = 0; j <= n; j++)
{
if(d[i][k] && d[k][j])
{
d[i][j] = -1;
}
}
}
}
}
void output()
{
for(int i = 0; i <= n; i++)
{
for(int j = 0; j <= n; j++)
{
printf(j != n?"%d ":"%d\n", d[i][j]);
}
}
}
int main()
{
int times = 0;
while(~scanf("%d", &m))
{
init();
while(m--)
{
int u, v;
scanf("%d%d", &u, &v);
d[u][v] = 1;
n = max(n, max(u, v));
}
Floyd();
printf("matrix for city %d\n", times++);
output();
}
return 0;
}