//floyd的变形,亦或者说是dp的统计路径? //如何判断回路呢? 我们可以这么想,假设c[k][k]不等于0 那么由k->k之间一定有回路,,那么我再去找经过k点的所有点(因为能否经过k已经 //保存). #include <iostream> #include <cstdio> #include <vector> #include <memory.h> using namespace std; const int MAX=50; bool circleYes,vis[MAX]; int n,m,c[MAX][MAX],map[MAX][MAX],fa[MAX]; vector<int> v; int main() { freopen("i.txt","r",stdin); //freopen("e://t2.txt","w",stdout); int c1,c2,t,num=0; while(cin>>m){ cout<<"matrix for city "<<num++<<endl; n=0; memset(c,0,sizeof(c)); for(int i=0;i<m;i++){ cin>>c1>>c2; c[c1][c2]=1;//c1->c2 n=n>(t=c1>c2?c1:c2)?n:t; } memcpy(map,c,sizeof(map)); //cout<<n<<endl; for(int k=0;k<=n;k++){ for(int i=0;i<=n;i++){ for(int j=0;j<=n;j++){ c[i][j]=c[i][j]+(c[i][k]*c[k][j]); } } } for(int k=0;k<=n;k++){ if(c[k][k]){ c[k][k]=-1; for(int i=0;i<=n;i++){ for(int j=0;j<=n;j++){ if(c[i][k]!=0&&c[k][j]!=0) c[i][j]=-1; } } } } for(int i=0;i<=n;i++){ for(int j=0;j<=n;j++){ if(j) cout<<" "; cout<<c[i][j]; } cout<<endl; } } return 0; }