//yong mat[][] Momery Limit #define MAXN 10005 #include<iostream> #include<vector> using namespace std; int n,m,x,y,ans; vector<int> V,v[MAXN],v1[MAXN]; int toposort() { V.clear(); int d[MAXN],i,j,k=0; int sum=0,cnt=-1; for(i=0;i<n;i++) { d[i]=0; d[i]+=v1[i].size(); } while(1) { for(i=0;i<n;i++) //TLE!!!!!!! { if(d[i]==0) { V.push_back(i); k++; } } cnt++; sum+=cnt*V.size(); if(V.empty()&&k<n) return 0; else if(k==n) break; while(V.size()>0) { i=V.front(); V.pop_back(); d[i]=-1; for(j=0;j<v[i].size();j++) d[v[i][j]]--; //ret[k++]=i; } } return sum; } int main() { int i; while(cin>>n>>m) { for(i=0;i<n;i++) { v[i].clear(); v1[i].clear(); } for(i=0;i<m;i++) { scanf("%d%d",&x,&y); x--,y--; v[x].push_back(y); v1[y].push_back(x); } int sum=toposort(); if(sum) cout<<888*n+sum<<endl; else cout<<-1<<endl; } return 0; } /*参考大牛的代码,解决了TLE,大体思路差不多。。关键在于层数上的更新*/ #include<iostream> using namespace std; #include<vector> #include<queue> #define max 10002 int in_degree[max]; //记录顶点的入度。 vector<int> vec[max]; //后继点 int sum[max]; //初始化邻接表,用vector表示。 void init(int n) { for(int i=1;i<=n;++i) { in_degree[i]=0; sum[i]=0; vec[i].clear(); } } //在a后面插入b节点。 void insert(int a,int b) { vec[a].push_back(b); in_degree[b]++; } //进行拓扑排序,无环则为true,否则为false。 bool toposort(int n) { int count,i,temp; queue<int> que; for(i=1;i<=n;i++) { if(in_degree[i]==0) que.push(i); } count=0; while(!que.empty()) { temp=que.front(); que.pop(); count++; for(i=0;i<vec[temp].size();i++) { //关键更新,并解决了我之前的TLE sum[vec[temp][i]]=sum[vec[temp][i]]>(sum[temp]+1)?sum[vec[temp][i]]:(sum[temp]+1); if(--in_degree[vec[temp].at(i)]==0) que.push(vec[temp][i]); } } if(count == n) return true; else return false; } int main () { int n,m,a,b,i,temp; while(cin>>n>>m) { init(n); for(i=0;i<m;i++) { scanf("%d%d",&a,&b); insert(b,a); //逆向拓扑排序 } if(toposort(n)) { temp=0; for(i=1;i<=n;i++) temp+=sum[i]; printf("%d/n",n*888+temp); } else printf("-1/n"); } return 0; }