floyed的变形,cnt[i][j]+=cnt[i][k]*cnt[k][j];
如果存在回路的话,cnt[n][n]!=0;
下面是代码:
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
const int MAX=50;
int grid[MAX][MAX],cnt[MAX][MAX];
int big,loop;
void floyed()
{
for(int k=0;k<=big;k++)
for(int i=0;i<=big;i++)
{
for(int j=0;j<=big;j++)
{
cnt[i][j]+=cnt[i][k]*cnt[k][j];
}
}
for(int k=0;k<=big;k++)
{
if(cnt[k][k])
for(int i=0;i<=big;i++)
{
for(int j=0;j<=big;j++)
if(cnt[i][k]&&cnt[k][j])
cnt[i][j]=-1;
}
}
cout<<"matrix for city "<<loop++<<endl;
for(int i=0;i<=big;i++)
{
for(int j=0;j<big;j++)
cout<<cnt[i][j]<<' ';
cout<<cnt[i][big]<<endl;
}
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
#endif
int N;
loop=0;
while(cin>>N)
{
int x,y;
big=0;
memset(grid,0,sizeof(grid));
memset(cnt,0,sizeof(cnt));
for(int i=0;i<N;i++)
{
scanf("%d%d",&x,&y);
cnt[x][y]=1;
big=max(big,max(x,y));
}
floyed();
}
return 0;
}