标签:
链接:点击打开链接
题意:每个人的基本工资为888,给出两个人的关系a,b,代表a的工资比b高问满足所有条件的话,最少需要支付多少钱
代码:
#include <iostream> #include <string.h> #include <stdlib.h> #include <stdio.h> #include <string.h> #include <algorithm> #include <vector> #include <queue> using namespace std; int prefix[10005],n,m; int temp[10005],sum[10005]; vector<int>v[10005]; int toposort(){ queue<int>q; int i,j,k,u,cur,sign; int t[10005]; for(i=1;i<=n;i++){ if(!prefix[i]){ q.push(i); //prefix为0的点都为888 sum[i]=888; } } k=0; while(q.size()){ u=q.front();q.pop(); k++; for(i=0;i<v[u].size();i++){ prefix[v[u][i]]--; if(prefix[v[u][i]]==0) q.push(v[u][i]); sum[v[u][i]]=sum[u]+1; //这个点所连的点的sum数组值都为sum[u]+1 } // cout<<cur<<endl; } if(k<n) return 0; return 1; } //拓扑排序模板 int main(){ int i,j,a,b,cur,flag,sumsum; while(scanf("%d%d",&n,&m)!=EOF){ for(i=0;i<=n;i++){ v[i].clear(); prefix[i]=0; } for(i=0;i<m;i++){ scanf("%d%d",&a,&b); //反向建图,使得原本最深处的prefix值为0,最后在计算时直接赋为888,方便计算后面的值 v[b].push_back(a); prefix[a]++; } // for(i=1;i<=n;i++) // sort(v[i].begin(),v[i].end()); sumsum=0; flag=toposort(); if(!flag) printf("-1\n"); else{ for(i=1;i<=n;i++) sumsum+=sum[i]; printf("%d\n",sumsum); } } return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:
原文地址:http://blog.csdn.net/stay_accept/article/details/47728621