题意
给出n个公司 m条信息
当某条信息构成环了 则这条信息是错误的
统计有多少个信息是错误的
这题是一条一条读入 虽然分在拓扑排序类里面 但是不会用拓扑排序来做
可以用floyd思想来做
如果 !mp[b][a]
那么是可行的 并在mp[a][b]连边
枚举i 如果mp[i][a]可以行 那么mp[i][b]可以 枚举j如果mp[b][j]可行 那么mp[a][j]可行 最重要的一点!!!再连mp[i][j]!
注意初始化 i i =1


#include<bits/stdc++.h> using namespace std; //input by bxd #define rep(i,a,b) for(int i=(a);i<=(b);i++) #define repp(i,a,b) for(int i=(a);i>=(b);--i) #define RI(n) scanf("%d",&(n)) #define RII(n,m) scanf("%d%d",&n,&m) #define RIII(n,m,k) scanf("%d%d%d",&n,&m,&k) #define RS(s) scanf("%s",s); #define ll long long #define pb push_back #define REP(i,N) for(int i=0;i<(N);i++) #define CLR(A,v) memset(A,v,sizeof A) #define inf 0x3f3f3f3f ////////////////////////////////////// const int N=250; int mp[N][N]; int n,m; void add(int a,int b) { mp[a][b]=1; rep(i,1,n) { if(!mp[i][a])continue; mp[i][b]=1; rep(j,1,n) { if(!mp[b][j])continue; mp[a][j]=1; mp[i][j]=1; } } /* 200ms rep(i,1,n) { if(mp[i][a]==0)continue; rep(j,1,n) if(mp[i][a]&&mp[a][j]) mp[i][j]=1; } rep(i,1,n) { if(mp[i][b]==0)continue; rep(j,1,n) if(mp[i][b]&&mp[b][j]) mp[i][j]=1; } */ } int main() { int cas=0; while(~RII(n,m),n||m) { CLR(mp,0); rep(i,1,n) mp[i][i]=1; int cnt=0; while(m--) { int a,b; RII(a,b); if(mp[b][a]||a==b) cnt++; else if(mp[a][b]==0) add(a,b); } printf("%d. %d\n",++cas,cnt); } return 0; }