思路:先缩点处理,之后就比较难了,因为要选一条边逆向走,总不能用枚举的方法来做把,考虑到缩点后的图必然是一个DAG(有向无环图),于是我们只需要考虑两类点:
第一类点:能够从草场1所在的点到达的点
第二类点:能够从所在点到达草场1的点
那么我们只要求出从草场1所在点走到每个第一类点的最大收益Ai和从从二类点所在点走到一类点的最大收益Bi即可求出答案
前者是很容易求的,但是后者怎么求呢?很简单,只需要将图反向,那么能从1所在点到达的点便是二类点,所以后者也很容易的就解决了。
最后我们要做的就是枚举出每个二类点或者一类点,如果该这个二类点或一类点与另外一种点间有一条边的话,就算出Ai+Bi的值再加上1号草场所在点的值即可得出答案
#include <iostream>
#include <cstring>
#include <cstdio>
#define init(a,b) memset(a, b, sizeof(a))
#define Min(a,b) a<b?a:b
#define Max(a,b) a>b?a:b
#define debug(a) printf("Debug %d\n", a)
using namespace std;
const int maxn &#