想了一个小时了,脑子糊了。
用bfs爆搜可贿赂节点,遍历累加贿赂成本,存连通性数组flag,最后判断输出。
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
typedef struct{
vector<int> to;
} Node;
const int maxn=3e3, maxm=8e3;
int n, p, r, val[maxn+5], ans=0;
Node e[maxm+5];
bool flag[maxn+5];
void bfs(int root){
int t;
queue<int> q;
q.push(root);
while (!q.empty()){
t = q.front(); q.pop();
if (val[t] == 0) continue;
for (auto i:e[t].to)
if (!flag[i]){q.push(i); flag[i] = 1;}
flag[t] = 1;
ans += val[t];
}
}
int main(){
cin >> n;
cin >> p;
for (int i=1,num; i <= p; i++) cin >> num >> val[num];
cin >> r;
for (int i=1,a,b; i <= r; i++){
cin >> a >> b;
e[a].to.push_back(b);
}
for (int i=1; i <= n; i++){
if (val[i] && !flag[i]) bfs(i);
}
for (int i=1; i <= n; i++){
if (!flag[i]){
cout << "NO" << endl;
cout << i;
return 0;
}
}
cout << "YES" << endl;
cout << ans;
return 0;
}