题目大意是说给你一些变化规则,让你求出从一个数变到另外一个数的方法数,如果是无限种,则输出-1
由于最后需要用矩阵表示,所以用floyd比较简单,需要特殊处理下有无限种的可能,即出现环的情况
代码:
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
const int maxn=101;
int n,m,map[maxn][maxn];
void solve()
{
for(int k=0;k<=m;k++)
for(int i=0;i<=m;i++)
for(int j=0;j<=m;j++)
if(map[i][k]&&map[k][j])
map[i][j]+=map[i][k]*map[k][j];
for(int k=0;k<=m;k++)
if(map[k][k])
for(int i=0;i<=m;i++)
for(int j=0;j<=m;j++)
if(map[i][k]&&map[k][j])
map[i][j]=-1;
for(int i=0;i<=m;i++,printf("\n"))
for(int j=0;j<=m;j++)
printf(" %d",map[i][j]);
}
int main()
{
int cas=0;
while(scanf("%d",&n)!=EOF)
{
memset(map,0,sizeof(map));
m=0;
for(int i=0;i<n;i++)
{
int u,v;
scanf("%d%d",&u,&v);
map[u][v]=1;
m=max(m,u);
m=max(m,v);
}
printf("matrix for city %d\n",cas++);
solve();
}
return 0;
}