题意不说了,说下思路。
对拓扑排序的理解:不用考虑哪些等级是相同的,一旦先把入度为零的点入队后,拓扑排序就是按照最最优的等级高低排序的;(等级尽可能低的就会提前入队)
给出的关系是a要求的工资要比b的工资多,由于尽可能的让老板少付钱,那么a的工资就是b的工资+1,可以确定关系为a>b,根据拓扑排序建边的原则是把“小于”关系看成有向边,那么我们可以建边v->u。
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string.h>
#include<vector>
#include<cmath>
#include<string>
#include<map>
#include<queue>
using namespace std;
#define INF 0x3f3f3f3f
typedef long long ll;
vector<ll> p[10001];
ll in[10001],n,num[10001];
//简单拓扑排序
ll topusort(){
queue<ll> q;
for(int i=1;i<=n;i++){
if(in[i]==0){
q.push(i);
in[i]--;
}
}
ll cnt=0,sum=0;
while(!q.empty()){
ll t=q.front();
cnt++;
sum+=num[t];
q.pop();
for(int i=0;i<p[t].size();i++){
ll v=p[t][i];
in[v]--;
if(in[v]==0){
q.push(v);
num[v]=num[t]+1;
}
}
}
if(cnt!=n){//cnt不为n,说明有环
return -1;
}
else return sum;
}
int main(){
ll m;
while(cin>>n>>m){
for(int i=1;i<=n;i++){
p[i].clear();
}
memset(in,0,sizeof(in));
memset(num,0,sizeof(num));
for(int i=1;i<=m;i++){
ll x,y;
cin>>x>>y;
in[x]++;
p[y].push_back(x);
}
ll sum=topusort();
if(sum!=-1)
sum+=888*n;
cout<<sum<<endl;
}
return 0;
}