2 1 1 2 2 2 1 2 2 1
1777 -1
题目大意:
n个人,m条边,每条边a,b 表示a比b的工资多1,每个人的工资至少888,问你工资和至少多少?如果出现矛盾关系,输出-1
解题思路:
解题思路:根据人的工资关系建立拓扑图,工资尽量从888开始,然后根据是否能全部排好序判断是出现矛盾关系。
#include <iostream> #include <cstdio> #include <queue> #include <vector> using namespace std; const int maxn=11000; int n,m,ans[maxn],r[maxn]; vector <vector<int> > v; void input(){ v.clear(); v.resize(n+1); for(int i=0;i<=n;i++){ ans[i]=-1; r[i]=0; } int a,b; while(m-- >0){ scanf("%d%d",&a,&b); v[b].push_back(a); r[a]++; } } void solve(){ queue <int> q; for(int i=1;i<=n;i++){ if(r[i]==0) q.push(i); } int tmp=888; while(!q.empty()){ int qsize=q.size(); while(qsize-- >0){ int s=q.front(); q.pop(); ans[s]=tmp; for(int i=0;i<v[s].size();i++){ int d=v[s][i]; r[d]--; if(r[d]==0) q.push(d); } } tmp++; } int sum=0; for(int i=1;i<=n;i++){ if(ans[i]>0) sum+=ans[i]; else{ sum=-1; break; } } printf("%d\n",sum); } int main(){ while(scanf("%d%d",&n,&m)!=EOF){ input(); solve(); } return 0; }
HDU 2647 Reward(图论-拓扑排序),布布扣,bubuko.com
原文:http://blog.csdn.net/a1061747415/article/details/38317031