标签:
逆拓扑排序,开始死活a不掉,后来才发现自己记录工资的方法是有问题的.....失策失策啊
#include<iostream>
#include<queue>
#include<vector>
#include<cstdio>
#define maxn 10000+100
using namespace std;
vector<vector<int> >mapp;
int head[maxn];
int money[maxn];
int n,m;
void topo()
{
int sum=0,t=0;
queue<int>root;
for(int i=1;i<=n;i++)
{
if(!head[i]) root.push(i);
}
//salary++;
while(root.size())
{
int x=root.front() ;
root.pop() ;
int temp=money[x];
//sum+=salary;
t++;
for(int i=0;i<mapp[x].size() ;i++)
{
head[mapp[x][i]]--;
if(!head[mapp[x][i]]) root.push(mapp[x][i]),money[mapp[x][i]]=temp+1;
}
//if(flag) salary++;
}
if(t==n)
{
sum+=n*888;
for(int i=1;i<=n;i++) sum+=money[i];
cout<<sum<<endl;
}
else cout<<"-1"<<endl;
}
int main()
{
while(scanf("%d%d",&n,&m)!=EOF)
{
mapp.resize(n+1);
for(int i=0;i<n+1;i++) money[i]=head[i]=0,mapp[i].clear();
while(m--)
{
int x,y;
cin>>x>>y;
mapp[y].push_back(x);
head[x]++;
}
topo();
}
return 0;
}标签:
原文地址:http://blog.csdn.net/zafkiel_nightmare/article/details/45050827