直接用BFS就给这题水了
没太多想,以每个点为起点,做一次BFS就可以了,最笨的方法,每个点的路径要×多少就是队头累加数+1,这样,每次BFS都会返回一个路径和,取其中一个最小的就可以了,res初值0x3f3f3f3f
#include <iostream>
#include <algorithm>
#include <cstring>
#include <queue>
using namespace std;
const int N = 110;
int n ;
int graph[N][N];//存图
int biaoji[N];//标记每个点是否被访问过
int person[N];//每个点的人口
int res;//最终的答案
int leijia[N];//这个就是每个点的路径应该×几
int bfs(int u)
{
memset(leijia , 0 ,sizeof leijia);
memset(biaoji , 0 ,sizeof biaoji);
queue<int > q;
q.push(u);
biaoji[u] = 1;
int ans = 0 ;
while(q.size())
{
int point;
point = q.front();
q.pop();
for(int i = 1 ; i <= n; i++ )
{
if(graph[point][i]&&!biaoji[i])
{
ans+=person[i]*(leijia[point]+1);
leijia[i]=leijia[point]+1;
q.push(i);
biaoji[i] = 1;
}
}
}
return ans;
}
int main()
{
cin>>n;
res=0x3f3f3f3f;
for(int i = 1 ; i <= n ; i++)
{
int a, b , c;
cin>>a>>b>>c;
person[i] = a;
//因为起点的位置不一定在哪,所以不一定是一直向下访问,有可能是向上的,所以建立无向边
if(b)//这个有点多余了,不用这个if也可以
{
graph[i][b] = 1;
graph[b][i] = 1;
}
if(c)
{
graph[i][c] = 1;
graph[c][i] = 1;
}
}
for(int i = 1; i <= n; i++)
{
res=min(res, bfs(i));
}
cout<<res<<' ';
return 0 ;
}
太棒了
提个小建议,行与行之间的空行太多会感觉不舒服(个人感受),也会占据大量篇幅,您的程序共117行,但删掉无用行后仅有64行