图的某个节点到各个节点的最小成本
#include
#include
using namespace std;
#define N 10000
vector Node[N];
vector value[N];
int n;
int pre[N];
int sum = 0;
int num = 1;
int vist[N] = { 0 };
void dfs(int s)//回溯法
{
if (sum < pre[s])
{
pre[s] = sum;//当前遍历到该节点路径的最小路径
}
if (num >=n)return;
for (int i = 0; i < Node[s].size(); i++)
{
if (vist[Node[s][i]] == 1 && sum + value[s][i] < pre[Node[s][i]])//已访问过但遍历成本比上一个最低成本低, 则把改遍历的成本存储
{
pre[Node[s][i]] = sum + value[s][i];
dfs(Node[s][i]);
}
else
{
vist[Node[s][i]] = 1;
sum += value[s][i];
num++;
dfs(Node[s][i]);
vist[Node[s][i]] = 0;
sum -= value[s][i];
num--;
}
}
}
int main()
{
cin >> n;
int u, v, val;
cin >> u >> v >> val;
while (u != 0)//存储图中各节点之间的关系 0结束输出
{
Node[u].push_back(v);
Node[v].push_back(u);
value[u].push_back(val);
value[v].push_back(val);
cin >> u >> v >> val;
}
for (int i = 0; i <= n; i++)
pre[i] = 999999;
vist[1] = 1;//从第一个结点开始遍历
dfs(1);
for (int i = 1; i <= n; i++)
cout << pre[i] << " ";
cout << endl;
return 0;
}、