prim 算法求最小生成树

还是畅通工程

Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 20712    Accepted Submission(s): 9213

Problem Description
某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离。省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可),并要求铺设的公路总长度为最小。请计算最小的公路总长度。
 
Input
测试输入包含若干测试用例。每个测试用例的第1行给出村庄数目N ( < 100 );随后的N(N-1)/2行对应村庄间的距离,每行给出一对正整数,分别是两个村庄的编号,以及此两村庄间的距离。为简单起见,村庄从1到N编号。 当N为0时,输入结束,该用例不被处理。
 
Output
对每个测试用例,在1行里输出最小的公路总长度。
 
Sample Input
3
1 2 1
1 3 2
2 3 4
4
1 2 1
1 3 4
1 4 1
2 3 3
2 4 2
3 4 5
0
 
Sample Output
3
5

Hint

Hint

Huge input, scanf is recommended.

Source
 
Recommend
JGShining

 #include<stdio.h>
#include<string.h>
#define max 100000000
int map[][],sum,min;// map[i][j] 记录从点 i 到点 j 的距离 !
int main()
{
int n,m,i,x,y,dis,j,flag,visit[];
while(~scanf("%d",&n)&&n!=)
{ m=(n*(n-))/;
memset(map, , sizeof(map));//数组清零
memset(visit,,sizeof(visit));
for(i=;i<m;i++)
{
scanf("%d%d%d",&x,&y,&dis);
map[x-][y-]=map[y-][x-]=dis;
}
for(i=;i<n;i++)
map[i][i]=max;//建图完成 !
visit[]=; sum=;
for ( i=; i<n; i++)//prim 算法求最小生成树
{
min= ;
for ( j=; j<n; j++)
{
if (!visit[j] && map[][j] < min)
{
min = map[][j];
flag = j;
}
}
sum += min;
visit[flag] = ;
for ( j=; j<n; j++)
{
if (!visit[j] && map[][j] > map[flag][j])
{
map[][j] = map[flag][j];
}
}
}
printf("%d\n",sum);
}
return ;
}

prim写成函数的方式,更容易理解。

 #include<stdio.h>
int map[][],visit[];
int length[];
int getmin(int n)
{
int i,min;
for(i=;i<=n;i++)
{
if(visit[i]==)
{
min=i;
break;
}
}
for(i++;i<=n;i++)
{
if(visit[i]==&&length[min]>length[i])
min=i;
}
return min;
}
int prim(int n)
{
int i,j;
int min;
int sum;
for(i=;i<=n;i++)
{
visit[i]=;
length[i]=map[][i];
}
visit[]=;
sum=;
for(i=;i<=n;i++)
{
min=getmin(n);
visit[min]=;
sum+=length[min];
for(j=;j<=n;j++)
{
if(visit[j]==)
{
if(map[min][j]<length[j])
{
length[j]=map[min][j];
}
}
}
}
return sum;
}
int main()
{
int n, m;
int i;
int min;
int u, v, cost;
while (scanf("%d", &n) != EOF && n != )
{
m = n * (n - ) / ;
for (i = ; i <= n; i++)
map[i][i] = ;
for (i = ; i < m; i++)
{
scanf("%d%d%d", &u, &v, &cost);
map[u][v] = cost;
map[v][u] = cost; }
min = prim(n);
printf("%d\n", min);
}
return ;
}

浓缩版:

#include<stdio.h>
#include<string.h>
#define MAX 100000
int map[][],v[];
int prim(int n)//最好的prim的模板。
{
int k[],i,j;
int min,sum=,flag,count=;
memset(k,,sizeof(k));
memset(v,,sizeof(v));
for(i=;i<=n;i++)
k[i]=map[][i];
for(i=;i<=n;i++)
{
min=MAX;
for(j=;j<=n;j++)
{
if(min>k[j]&&v[j]==)
{
min=k[j];
flag=j;
}
}
sum+=min;
v[flag]=;
for(j=;j<=n;j++)
if(v[j]==&&k[j]>map[flag][j]&&flag!=j)
k[j]=map[flag][j];
}
return sum;
}
int main()
{
int n,m,i,j,p,q,r,min;
while(~scanf("%d",&n)&&n!=)
{
m=n*(n-)/;
for(i=;i<=n;i++)
for(j=;j<=n;j++)
{
if(i==j) map[i][j]=;
else
map[i][j]=MAX;
}
for(i=;i<m;i++)
{
scanf("%d%d%d",&p,&q,&r);
map[p][q]=map[q][p]=r;
}
min=prim(n);
printf("%d\n",min);
}
return ;
}

HDU-1233 还是畅通工程 (prim 算法求最小生成树)的更多相关文章

  1. hdu 1233 还是畅通工程 (prim, kruskal)

    还是畅通工程Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submi ...

  2. hdu 1233 还是畅通project(kruskal求最小生成树)

    还是畅通project Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Tota ...

  3. HDU.1233 还是畅通工程(Prim)

    HDU.1233 还是畅通工程(Prim) 题意分析 首先给出n,代表村庄的个数 然后出n*(n-1)/2个信息,每个信息包括村庄的起点,终点,距离, 要求求出最小生成树的权值之和. 注意村庄的编号从 ...

  4. Kruskal和Prim算法求最小生成树

    Kruskal算法求最小生成树 测试数据: 5 6 0 1 5 0 2 3 1 2 4 2 4 2 2 3 1 1 4 1 输出: 2 3 1 1 4 1 2 4 2 0 2 3 思路:在保证不产生回 ...

  5. HDU 1233 还是畅通工程(Kruskal算法)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1233 还是畅通工程 Time Limit: 4000/2000 MS (Java/Others)   ...

  6. hdu 1233 还是畅通工程 (最小生成树)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1233 还是畅通工程 Time Limit: 4000/2000 MS (Java/Others)    ...

  7. hdu 1233:还是畅通工程(数据结构,图,最小生成树,普里姆(Prim)算法)

    还是畅通工程 Time Limit : 4000/2000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other) Total Submis ...

  8. hdu 1233 还是畅通工程 最小生成树(prim算法 + kruskal算法)

    还是畅通工程                                                                            Time Limit: 4000/2 ...

  9. HDU 1879 继续畅通工程 (Prim(普里姆算法)+Kruskal(克鲁斯卡尔))

    继续畅通工程 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Sub ...

随机推荐

  1. height为100%的问题

    问题描述 很多同学,对于设置div 的高度为100%时,有疑惑. 设置div 的高度为100%,意思是此 div 的高度 铺满父元素. 那么 怎么使 div 铺满浏览器屏幕? 代码 <!DOCT ...

  2. 关于web开发的一点理解

    对于web开发上的一点理解 1 宏观上的一点理解 网页从请求第地址 到获得页面的过程:从客户端(浏览器)通过地址 从soket把请求报文封装发往服务端   服务端通过解析报文并处理报文最后把处理的结果 ...

  3. SQL优化(2)

    建表时候数据库引擎的选择也可以达到优化的效果 InnoDB: 基于磁盘的资源是InnoDB表空间数据文件和它的日志文件,InnoDB 表的大小只受限于操作系统文件的大小,一般为 2GB MyISAM: ...

  4. ubuntu上 安装 基于sphinx 的 coreseek 全文搜索

    原生sphinx不支持中文, sphinx-for-chinese匹配中文时也不返回结果 ,真纠结,  最好试了 coreseek,这个能正确返回结果了, 所以记录一下 1 http://www.co ...

  5. 深入了解float

    1.float的历史   初衷是为了图片的文字环绕,将img设置float 2.破坏性与包裹性  a.父元素没有设置高度,内部元素浮动后,服务元素的高度被破坏了,可以将其父元素设置overflow:h ...

  6. zTree的getChangeCheckedNodes()使用

    zTree的getChangeCheckedNodes()方法用于获取输入框勾选状态被改变的节点集合.如果需要获取每次操作后全部被改变勾选状态的节点数据,请在每次勾选操作后,遍历所有被改变勾选状态的节 ...

  7. Dom操作--跑马灯效果

    这里给园友们演示的是Dom操作实现跑马灯效果,相信我们很多人都用Winform实现过跑马灯效果,其中的关键就是Tirm控件,那么在Dom操作中是用setInterval方法来实现隔一段时间执行一段代码 ...

  8. (WinForm)FormBorderStyle属性

    此属性就是获取或设置窗体的边框样式,默认值为 FormBorderStyle.Sizable.共7个值. 属性 意义 None 无边框 FixedSingle 固定的单行边框 Fixed3D 固定的三 ...

  9. 浅谈JavaScript词法分析步骤

    JavaScript代码运行前有一个类似编译的过程即词法分析,词法分析主要有三个步骤: 分析参数 再分析变量的声明 分析函数声明 具体步骤如下: 函数在运行的瞬间,生成一个活动对象(Active Ob ...

  10. C语言-06复杂数据类型-04 结构体

    结构体的说明(构造类型) 数组:只能由多个相同类型的数据构成 结构体:可以由多个不同类型的数据构成 ,结构体的类型是不存在的,自己定义 int main() { // 1.定义结构体类型 定义类型的时 ...