思路:
若a比b钱少,则从a连向b,进行一次拓扑排序后,即可从小到大确定顺序
代码:
#include <iostream>
#include <string.h>
#include <algorithm>
#include <queue>
#include <math.h>
using namespace std;
const int MAX_N=500000;
struct edge
{
int to,next;
}e[3*MAX_N];
int p[MAX_N],eid;
void init()
{
eid=0;
memset(p,-1,sizeof(p));
}
void insert(int u,int v)
{
e[eid].to=v;
e[eid].next=p[u];
p[u]=eid++;
}
int indegree[MAX_N],val[MAX_N];
int n,cnt=0,ans[MAX_N];
int topo()
{
queue<int>Q;
int cnt=0;
for(int i=1;i<=n;i++)
{
if(indegree[i]==0)
Q.push(i);
}
while(!Q.empty())
{
int now=Q.front();
// cout<<now<<endl;
cnt++;
Q.pop();
for(int i=p[now];i!=-1;i=e[i].next)
{
int v=e[i].to;
val[v]=val[now]+1;
indegree[v]--;
if(indegree[v]==0)
Q.push(v);
}
}
if(cnt==n)
return 1;
else
return 0;
}
int main()
{
init();
memset(indegree,0,sizeof(indegree));
fill(val,val+MAX_N,100);
int m;
cin>>n>>m;
for(int i=0;i<m;i++)
{
int a,b;
cin>>a>>b;
insert(b,a);
indegree[a]++;
}
int sum=0;
if(topo())
{
for(int i=1;i<=n;i++)
sum+=val[i];
cout<<sum<<endl;
}
else
cout<<"Unhappy!"<<endl;
return 0;
}