//拓扑排序,若a员工工资比b员工多,那么从b->a建立有向边 //接着从工资应该最小的员工开始逐步向工资最大的员工叠加 //注意对DAG环的判断 //注意因为结点数高达10000,因此必须用邻接表储存 #include<iostream> #include<vector> #include<cstring> #include<queue> using namespace std; const int MAX = 10005; vector<int> e[MAX];//用vector储存临界表 int cost[MAX];//每个结点的工资 int inDeg[MAX];//入度 int ans; int n,m; int u,v; int sorted; bool ring; queue<int> q; int main() { scanf(“%d%d”,&n,&m); memset(cost,0,sizeof(cost)); memset(inDeg,0,sizeof(inDeg)); sorted = 0;//已成功拓扑排序的数目 ring = 1; while(m–) { scanf(“%d%d”,&u,&v); e[v].push_back(u);//从v->u建图 inDeg[u]++;//入度+1 } for(int i = 1;i <= n;++i) { if(inDeg[i] == 0)//拓扑排序从入度为0的点开始 { ring = 0; cost[i] = 100;//初始化 q.push(i); } } while(!q.empty()) { u = q.front(); q.pop(); ++sorted;//每从队列丢掉一个,则说明成功排序一个 ans += cost[u]; for(int j = 0;j < e[u].size();++j) { if(–inDeg[e[u][j]] == 0) q.push(e[u][j]);//如果入度-1后等于0,加入队列 cost[e[u][j]] = cost[u]+1; } } if(sorted == n)//若此数目结果为n,则说明DAG中无环。如果有环 printf(“%d/n”,ans); else printf(“Poor Xed/n”); return 0; }
Sicily 1424 奖金(拓扑排序)
原文作者:拓扑排序
原文地址: https://blog.csdn.net/ChinaCzy/article/details/5652261
本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
原文地址: https://blog.csdn.net/ChinaCzy/article/details/5652261
本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。