CCF 交通规划 100分
试题编号: | 201609-4 |
试题名称: | 交通规划 |
时间限制: | 1.0s |
内存限制: | 256.0MB |
问题描述: | 问题描述 G国国王来中国参观后,被中国的高速铁路深深的震撼,决定为自己的国家也建设一个高速铁路系统。 输入格式 输入的第一行包含两个整数n, m,分别表示G国城市的数量和城市间铁路的数量。所有的城市由1到n编号,首都为1号。 输出格式 输出一行,表示在满足条件的情况下最少要改造的铁路长度。 样例输入 4 5 样例输出 11 评测用例规模与约定 对于20%的评测用例,1 ≤ n ≤ 10,1 ≤ m ≤ 50; |
思路:
在Dijkstra求最短路径的基础上,加入prim的思想,加入cost数组。
cost[u] = 10。表明在已有的最短路径的基础上,想要把u也和首都连通起来,那么需要的最小花费是10。这个很像prim,这里的cost不像Dijkstra中的dis数组,用来求从源点到目的点的最短路径,而是像prim中的dis数组,用来求把这个点加入到连通图中的最小代价。
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
const int MAXN = 10002;
const int INF = 999999;
struct Node{
int v;
int w;
Node(int v,int w){
this->v = v;
this->w = w;
}
};
vector<Node> adj[MAXN];
int dis[MAXN];
bool vis[MAXN];
int cost[MAXN];
void Dijkstra(int s,int n){
fill(dis,dis+n+1,INF);
dis[s] = 0;
cost[s] = 0;
for(int i=1;i<=n;i++){
int u = -1;
int minDis = INF;
for(int j=1;j<=n;j++){
if(!vis[j] && minDis > dis[j]){
minDis = dis[j];
u = j;
}
}
if(u == -1){
break;
}
vis[u] = true;
for(int j=0;j<adj[u].size();j++){
int v = adj[u][j].v;
int w = adj[u][j].w;
if(!vis[v]){
if(dis[v] > dis[u] + w){
dis[v] = dis[u] + w;
cost[v] = w; //花费就是从u--->v的距离(prim思想)
}else if(dis[v] == dis[u] + w){
cost[v] = min(cost[v],w); //(prim思想)
}
}
}
}
}
int main(){
int n,m;
int u,v,w;
cin>>n>>m;
while(m--){
cin>>u>>v>>w;
adj[u].push_back(Node(v,w));
adj[v].push_back(Node(u,w));
}
Dijkstra(1,n);
int ans = 0;
for(int i=1;i<=n;i++){
ans += cost[i];
}
cout<<ans<<endl;
return 0;
}
还没有评论,来说两句吧...