ACM第四次练习—1004
来源:互联网 发布:淘宝开店装修店铺2016 编辑:程序博客网 时间:2024/05/22 03:38
题意:某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离。省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可),并要求铺设的公路总长度为最小。请计算最小的公路总长度。
思路:先用快排将所有路径按照从小到大的顺序排列,然后开一个节点标记数组,初始值定为1,将排在第一个的路径的前一个节点的标记设为0。之后进行计算,凡是前后路径标记之和为1的,说明之前两条路是不连通的,将长度加上,如果两条路之和加上为2,说明这两个节点之前已经可以走通了(两个节点中间一定有一个过渡节点,如1,2,和1,3,那么2,3一定联通),此时不加长度。每次搜索出来一个节点长度,就要返回从第一个重新开始搜索,以免少计算路径。直到所有路径全部搜索完毕,结束。求出的路径之和即为所求的最短路径即最小生成树。
感想:最小生成树问题。
代码:
#include <stdio.h>
#include <string.h>
#include <algorithm>
const int N = 101;
int map[N][N];
int mark[N];
int i,j,n;
int prim()
{
int sum = 0;
int min,t = n,k;
while(--t)
{
min = 100000;
for (i = 2; i <= n; i++)
{
if(mark[i] != 1 && min > map[1][i])
{
min = map[1][i];
k = i;
}
}
sum += min;
mark[k] = 1;
for (i = 2; i <= n; i++)
{
if(mark[i] != 1 && map[k][i] < map[1][i])
map[1][i] = map[k][i];
}
}
return sum;
}
int main()
{
int x,y,len,num;
while(scanf("%d",&n) && n != 0)
{
num = n*(n-1)/2;
memset(map,0,sizeof(map));
for (i = 1; i <= num; i++)
{
scanf("%d%d%d",&x,&y,&len);
map[x][y] = map[y][x] = len;
}
memset(mark,0,sizeof(mark));
printf("%d\n",prim());
}
return 0;
}
- ACM第四次练习—1004
- ACM第四次练习—1003
- ACM第四次练习—1001
- ACM第四次练习—1002
- ACM第四次练习—1005
- ACM第四次练习—1009
- ACM第四次练习—1006
- ACM第四次练习—1011
- ACM第四次练习—1008
- ACM第四次练习—1012
- ACM第四次练习—1013
- 第四次课堂练习
- 函数第四次练习
- XYNU—ACM暑假集训第四次测试 STL
- C语言第四次作业练习
- ACM第二次练习—1004
- ACM第三次练习—1004
- Coin Test n 204 郑州大学第四次ACM比赛试题
- Spring的事务管理
- 技术人员如何创业《二》- 合伙人的模式
- 信与信封问题_codevs1222_匹配
- python数据类型详解
- 菜单编辑器
- ACM第四次练习—1004
- 第三方服务器用PHP验证GameCenter GKLocalPlayer返回的签名
- matlab + mnist 调用训练好的caffe模型进行手写体识别
- 整理项目中使用的开源项目
- 调用导致堆栈不对称。原因可能是托管的 PInvoke 签名与非托管的目标签名不匹配。请检查 PInvoke 签名的调用约定和参数与非托管的目标签名是否匹配
- html——样式、链接和表格
- 技术人员如何创业《三》- 合伙人的分工
- Linux异步通知 fasync
- 十七. 增加一个项目协作留言板功能(三)----- 增加任务的修改和删除功能