刚开始把邻接表给建错了,应该反过来。。
我在自己测试的时候思维也这样,搞到我看不出自己哪里出错了。后来问师兄他说我的层反了,改了下还是错。最后发现不是层反了,是邻接表错了
#include <iostream> #include <queue> #include <vector> #include <cstring> using namespace std; int degree[10000]; //个顶点的入度 vector<int> adj[10000];//邻接表 int main() { int n, m; //freopen("C:/Documents and Settings/Alfred/桌面/1.txt", "r", stdin); while(cin >> n >> m) { int ans = n * 100; int level = 0; int sorted = 0; queue<int> q; for(int i = 0; i < n; i++) adj[i].clear(); memset(degree, 0 , sizeof(degree)); int a, b; for(int i = 0; i < m; i++) { cin >> a >> b; degree[a - 1]++; adj[b - 1].push_back(a - 1); } while(true) { //找出度为0的节点 for(int i = 0; i < n; i++) { if(degree[i] == 0) { q.push(i); degree[i] = -1; //为了防止二次访问节点 } } //没有入度为0的点就跳出循环 if(q.empty()) break; while(!q.empty()) { int tmp = q.front(); q.pop(); //入度减1 for(vector<int>::iterator iter = adj[tmp].begin(); iter != adj[tmp].end(); iter++) degree[*iter]--; sorted++; ans += level; } level++; } //判环 if(sorted == n) cout << ans << endl; else cout << "Poor Xed" << endl; } return 0; }