【题目网站】
http://ybt.ssoier.cn:8088/problem_show.php?pid=1338
【题目考点】
- 深度优限搜索的使用
- 列表的使用
- vector的使用
【题目思路】
- 用for来遍历每一个点
- 每一个点都计算出距离和
- 在对比算出最短的那一个
【题目答案】
#include <iostream>
#include <map>
#include <vector>
#include <queue>
using namespace std;
int n, l[105], sum = 10000000;
vector<int> v[105];
queue<pair<int, int> > q;
int bfs(){//深度优限搜索
for (int i = 1; i <= n; i++){
int cnt = 0;
q.push(make_pair(i, 1));
bool visit[105] = {false};
visit[i] = true;
while (!q.empty()){
pair<int, int> f = q.front();
for (int j = 0; j < v[f.first].size(); j++){
if (!visit[v[f.first][j]]){
int now = f.second;
cnt += now * l[v[f.first][j]];//求现在的距离和
visit[v[f.first][j]] = true;
q.push(make_pair(v[f.first][j], now + 1));
}
}
q.pop();
}
if (sum > cnt) sum = cnt;//取小
}
return sum;
}
int main(){
cin >> n;
for (int i = 1; i <= n; i++){
int t1, t2, t3;
cin >> t1 >> t2 >> t3;
if (t2 != 0){
v[i].push_back(t2);
v[t2].push_back(i);
}
if (t3 != 0){
v[i].push_back(t3);
v[t3].push_back(i);
}
l[i] = t1;
}
cout << bfs() << endl;
return 0;
}
【常见错误】
- 第20行的if判断条件写错
- 第24行步数没有加一
- 第12、36行for的i错误
- 第29行取小变成取大