一、一本通 1352 奖金
1.1 问题描述
1.2 问题分析
这道题使用拓扑排序的思想来做,题目要求a->b,发现不好算,就把这个图倒过来存,就比较好算了。
1.3 问题解决
#include <cstring>
#include <iostream>
using namespace std;
const int N = 1e5 + 10;
int n, m;
int h[N], e[N], ne[N], idx;
int d[N], s[N];
int q[N];
void add(int a, int b)
{
e[idx] = b, ne[idx] = h[a], h[a] = idx++;
}
bool topsort(int s[])
{
for(int i = 1; i <= n; i++)
s[i] = 100;
int hh = 0, tt = -1;
for(int i = 1; i <= n; i++)
if(d[i] == 0)
q[++tt] = i;
while(hh <= tt)
{
int t = q[hh++];
for(int i = h[t]; i != -1; i = ne[i])
{
int j = e[i];
if(--d[j] == 0)
{
s[j] = s[t]+1;
q[++tt] = j;
}
}
}
return tt == n-1;
}
int main()
{
scanf("%d%d", &n, &m);
memset(h, -1, sizeof(h));
while(m--)
{
int a, b;
scanf("%d%d", &a, &b);
add(b, a);
d[a]++;
}
if(!topsort(s)) puts("Poor Xed");
else
{
int sum = 0;
for(int i = 1; i <= n; i++) sum += s[i];
cout << sum << endl;
}
return 0;
}