AcWing 1192. 奖金
原题链接
简单
作者:
minux
,
2020-07-07 18:38:55
,
所有人可见
,
阅读 625
c++ 拓扑排序
#include <iostream>
#include <cstring>
#include <queue>
#include <vector>
using namespace std;
typedef pair<int, int> PII;
#define fi first
#define se second
const int N=10005;
const int M=20005;
int head[N], E=0, din[N];
struct Edge{int v, w, ne;}e[M];
int n, m;
inline void add(int a, int b){
e[E].v=b;
e[E].w=1;
e[E].ne=head[a];
head[a]=E++;
}
vector<int> ans;
queue<PII> q;
int sum=0;
void bfs(){
while(!q.empty()){
int node=q.front().fi, w=q.front().se; q.pop(); ans.push_back(node);
sum+=w;
for(int i=head[node]; ~i; i=e[i].ne){
int v=e[i].v;
din[v]--;
if(!din[v]) q.push({v, w+e[i].w});
}
}
}
int main(){
memset(head, -1, sizeof head);
memset(din, 0x00, sizeof din);
// 拓扑排序求解, 如果存在环, 则表示无解
cin>>n>>m;
for(int i=0; i<m; ++i){
int a, b;
cin>>a>>b;
add(b, a);
din[a]++;
}
for(int i=1; i<=n; ++i)
if(!din[i]) q.push({i, 100});
bfs();
if(ans.size()!=n){cout<<"Poor Xed"<<endl; return 0;}
cout<<sum<<endl;
return 0;
}