洛谷 P1364医院设置(BFS)
题目连接 https://www.luogu.com.cn/problem/P1364
思路:很多大佬用的是Folyd,个人觉得没必要,就是一个图的广搜而已,稍加处理一下就行了
#include "iostream"
#include "vector"
#include "queue"
using namespace std;
const int N = 105;
vector<int> g[N];
int num[N];
bool vis[N];
int n;
int ans = 0x3f3f3f3f;
struct Node {
int v;
int cnt;
};
void add(int x, int w, int u, int v) {
if(u != 0) {
g[x].push_back(u);
g[u].push_back(x);
}
if(v != 0) {
g[x].push_back(v);
g[v].push_back(x);
}
num[x] = w;
}
int bfs(int x) {
int res = 0;
queue<Node> q;
q.push({x, 0});
int l = 0;
bool f = 0;
while(!q.empty()) {
auto t = q.front();
int v = t.v;
if(!vis[v]) {
res += num[v] * t.cnt;
//cout << v << " " << t.cnt << endl;
vis[v] = 1;
}
for(int i = 0; i < g[v].size(); ++i) {
int j = g[v][i];
if(!vis[j]) {
q.push({j, t.cnt + 1});
}
}
q.pop();
}
return res;
}
int main() {
cin >> n;
for(int i = 1; i <= n; ++i) {
int w, u, v;
cin >> w >> u >>v;
add(i, w, u, v);
}
for(int i = 1; i <= n; ++i) {
for(int i = 1; i <= n; ++i) vis[i] = false;
ans = min(ans, bfs(i));
}
cout << ans;
return 0;
}