拓扑排序的代码
何老板规定保镖的工资都是整数,最低工资是100元。若保镖x打赢了保镖y,那么x的工资应该比y的要高。对于这种方式,保镖们纷纷表示支持。
于是比武开始了,总共进行了m场比武,何老板想根据比武结果,找出一种工资方案,使得总的工资数最少。
#include<iostream>
#include<cstdio>
#include<queue>
#define N 50000
using namespace std;
int End[N],Next[N],Last[N],de[N],cnt;
bool used[N];
struct node{int id,val;};
queue<node>q;
void Ins(int x,int y){
End[++cnt]=y;
Next[cnt]=Last[x];
Last[x]=cnt;
}
int Find(){
int Ans=0;
while(!q.empty()){
node u=q.front();q.pop();
Ans+=u.val;
for(int i=Last[u.id];i;i=Next[i]){
int v=End[i];de[v]--;
if(de[v]==0)q.push(node{v,u.val+1});
}
}
return Ans;
}
int main(){
// freopen("data.in","r",stdin);
// freopen("Mine.out","w",stdout);
int n,m,Ans;scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++){
int x,y;scanf("%d%d",&x,&y);
Ins(y,x),used[x]=true,de[x]++;
}
if(m==0)printf("%d",n*100);
else{
for(int i=1;i<=n;i++)
if(!used[i])q.push(node{i,0});
Ans=Find();
for(int i=1;i<=n;i++)
if(de[i]){Ans=0;break;}
if(Ans)printf("%d",Ans+n*100);
else puts("no solution");
}
return 0;
}