30分bfs求助
查看原帖
30分bfs求助
760395
Trom_Hu楼主2024/1/19 22:04

想了一个小时了,脑子糊了。

Code思路

用bfs爆搜可贿赂节点,遍历累加贿赂成本,存连通性数组flag,最后判断输出。

Code

#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;
}
2024/1/19 22:04
加载中...