hdu2647(拓扑排序)
链接:点击打开链接
题意:每一个人的基本工资为888,给出两个人的关系a,b,代表a的工资比b高问满足全部条件的话,最少须要支付多少钱
代码:
#include <map> #include <queue> #include <stack> #include <string> #include <vector> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <iostream> #include <algorithm> using namespace std; int n,m; vector<int> G[10005]; int d[10005],deg[10005]; int topo(){ int i,j,u,v,op; queue<int> qu; for(i=1;i<=n;i++) if(deg[i]==0) qu.push(i); op=0; while(qu.size()){ u=qu.front(); qu.pop(); op++; for(i=0;i<G[u].size();i++){ v=G[u][i]; deg[v]--; d[v]=max(d[v],d[u]+1); //相当于求关键路劲 if(deg[v]==0) qu.push(v); } } if(op!=n) return 0; return 1; } int main(){ int i,j,u,v,ans; while(scanf("%d%d",&n,&m)!=EOF){ for(i=1;i<=n;i++){ G[i].clear(); d[i]=deg[i]=0; } for(i=1;i<=m;i++){ //反向建图拓扑更新一下 scanf("%d%d",&u,&v); G[v].push_back(u); deg[u]++; } if(topo()==0) puts("-1"); else{ ans=0; for(i=1;i<=n;i++) ans+=d[i]; printf("%d\n",ans+888*n); } } return 0; }