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