试题编号: | 201609-4 |
试题名称: | 交通规划 |
时间限制: | 1.0s |
内存限制: | 256.0MB |
问题描述: | 问题描述 G国国王来中国参观后,被中国的高速铁路深深的震撼,决定为自己的国家也建设一个高速铁路系统。 输入格式 输入的第一行包含两个整数n, m,分别表示G国城市的数量和城市间铁路的数量。所有的城市由1到n编号,首都为1号。 输出格式 输出一行,表示在满足条件的情况下最少要改造的铁路长度。 样例输入 4 5 样例输出 11 评测用例规模与约定 对于20%的评测用例,1 ≤ n ≤ 10,1 ≤ m ≤ 50; |
//dijsktra算法改进一下即可
#include "stdafx.h"
#include <iostream>
#include <vector>
using namespace std;
const int max1 = 10005;
const long long inf = 1 << 30;
struct edge {
int to;
long long len;
}edge1;
vector<vector<edge> > mp(max1);
long long cost[max1];
bool visit[max1];
int path[max1];
long long minlen = 0;
void df(int n, int start)
{
int i,last=0;
for (i = 1; i <= n; i++)
{
cost[i] = inf;
visit[i] = false;
path[i] = 0;
}
cost[start] = 0;
path[start] = start;
while (1)
{
long long tem = inf;
int j = -1;
for (i = 1; i <= n; i++)
{
if (cost[i]<tem && !visit[i])
{
tem = cost[i];
j = i;
}
}
if (j == -1)break;
visit[j] = true;
minlen += cost[j] - cost[path[j]];
for (i = 0; i <mp[j].size(); i++)
{
if (!visit[mp[j][i].to])
{
if (mp[j][i].len + cost[j] < cost[mp[j][i].to]|| (mp[j][i].len + cost[j] == cost[mp[j][i].to]&& mp[j][i].len<cost[mp[j][i].to] - cost[path[mp[j][i].to]]))
{
cost[mp[j][i].to] = mp[j][i].len + cost[j];
path[mp[j][i].to] = j;
}
}
}
}
}
int main()
{
int n, m, i, a, b;long long c;
cin >> n >> m;
for (i = 0; i<m; i++)
{
cin >> a >> b >> c;
edge1.to = b;
edge1.len = c;
mp[a].push_back(edge1);
edge1.to = a;
mp[b].push_back(edge1);
}
df(n, 1);
cout << minlen;
cin >> i;
}