2 1 1 2 2 2 1 2 2 1
1777 -1
题意:有n个人,每个人最少发的奖金是888,现有m个要求,有m行a b,表示a 要求 b的奖金多。问能否满足所有的要求,如果能,则n个人得到的奖金总和最少是多少,不能满足所有要求就输出-1。
#include<stdio.h>
#include<string.h>
#include<queue>
#include<vector>
using namespace std;
const int N = 10005;
int n,mony[N],in[N];
vector<int>mapt[N];
void init()
{
for(int i=1;i<=n;i++)
mony[i]=888,in[i]=0,mapt[i].clear();
}
int tope()
{
queue<int>q;
int k=0,sum=0;
for(int i=1;i<=n;i++)
if(in[i]==0)
{
k++; q.push(i); in[i]=-1; sum+=mony[i];
}
while(!q.empty())
{
int s=q.front(); q.pop();
for(int i=0;i<mapt[s].size();i++)
{
int j=mapt[s][i];
if(in[j]>0)
{
in[j]--;
if(mony[j]<mony[s]+1)
mony[j]=mony[s]+1;
if(in[j]==0)
{
k++; in[j]=-1; q.push(j); sum+=mony[j];
}
}
}
}
if(k==n)
return sum;
return -1;
}
int main()
{
int m,a,b;
while(scanf("%d%d",&n,&m)>0)
{
init();
while(m--)
{
scanf("%d%d",&a,&b);
in[a]++; mapt[b].push_back(a);
}
printf("%d\n",tope());
}
}
原文:http://blog.csdn.net/u010372095/article/details/45176745