拓扑排序,注意求解的时候把边逆向过来求解~~~由于数据范围比较大,用邻接表来存储~~ http://acm.hdu.edu.cn/showproblem.php?pid=2647 #include<iostream> #include<stdio.h> #include<string.h> #include<string> #include<vector> #include<queue> #include<algorithm> using namespace std; #define max_point 10005 vector<int>vec[max_point]; int degree[max_point]; int sum[max_point]; int N,M; //初始化函数 void init() { for(int i=1;i<=N;++i) { vec[i].clear(); sum[i]=0; degree[i]=0; } } //插入边函数逆反过程 void insert(int a,int b) { vec[a].push_back(b); degree[b]++; } //这一步的主要操作就是进行排序,并且判断有环还是无环 bool toposort() { queue<int>que; for(int i=1;i<=N;++i) if(degree[i]==0) que.push(i); int count=0; while(!que.empty()) { int temp=que.front(); que.pop(); ++count; for(int i=0;i<vec[temp].size();++i) { sum[vec[temp][i]]=sum[vec[temp][i]]>sum[temp]+1?sum[vec[temp][i]]:sum[temp]+1; degree[vec[temp][i]]--; if(degree[vec[temp][i]]==0) que.push(vec[temp][i]); } } if(count==N) return true; else return false; } int main() { while(scanf("%d%d",&N,&M)!=EOF) { //初始化 init(); int a,b; for(int i=1;i<=M;++i) { scanf("%d%d",&a,&b); insert(b,a); } if(toposort()) { int temp=0; for(int i=1;i<=N;++i) temp+=sum[i]; printf("%d/n",N*888+temp); } else printf("-1/n"); } return 0; }