HDU-1233 还是畅通工程 (prim 算法求最小生成树)
prim 算法求最小生成树
还是畅通工程
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 20712 Accepted Submission(s): 9213
Hint
Huge input, scanf is recommended.
#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 算法求最小生成树)的更多相关文章
- hdu 1233 还是畅通工程 (prim, kruskal)
还是畅通工程Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submi ...
- hdu 1233 还是畅通project(kruskal求最小生成树)
还是畅通project Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Tota ...
- HDU.1233 还是畅通工程(Prim)
HDU.1233 还是畅通工程(Prim) 题意分析 首先给出n,代表村庄的个数 然后出n*(n-1)/2个信息,每个信息包括村庄的起点,终点,距离, 要求求出最小生成树的权值之和. 注意村庄的编号从 ...
- 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 思路:在保证不产生回 ...
- HDU 1233 还是畅通工程(Kruskal算法)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1233 还是畅通工程 Time Limit: 4000/2000 MS (Java/Others) ...
- hdu 1233 还是畅通工程 (最小生成树)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1233 还是畅通工程 Time Limit: 4000/2000 MS (Java/Others) ...
- hdu 1233:还是畅通工程(数据结构,图,最小生成树,普里姆(Prim)算法)
还是畅通工程 Time Limit : 4000/2000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other) Total Submis ...
- hdu 1233 还是畅通工程 最小生成树(prim算法 + kruskal算法)
还是畅通工程 Time Limit: 4000/2 ...
- HDU 1879 继续畅通工程 (Prim(普里姆算法)+Kruskal(克鲁斯卡尔))
继续畅通工程 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Sub ...
随机推荐
- Druid 简单介绍
官方网址:http://code.alibabatech.com/wiki/display/Druid/Home 1.什么是Druid Druid首先是一个数据库连接池.Druid是目前最好的数据库连 ...
- bzoj1068:[SCOI2007]压缩
思路:区间dp,设状态f[l][r][bo]表示区间[l,r]的答案,bo=1表示该区间可以放M也可以不放M,bo=0表示该区间不能放M,并且对于任意一个状态f,l和l-1之间均有一个M,于是就可以进 ...
- (zzuli)1907 小火山的宝藏收益
Description 进去宝藏后, 小火山发现宝藏有N个房间,且这n个房间通过N-1道门联通. 每一个房间都有一个价值为Ai的宝藏, 但是每一个房间也都存在一个机关.如果小火山取走了这个房间的宝藏, ...
- jQuery插件综合应用(四)头像设置
一.操作流程 会员点击头像设置,弹出一个层,在层中,有上传图片的按钮,用户点击按钮上传图片,图片在服务器端按大小压缩保存(方便剪切).保存后,在前端显示,然后用户可修剪图片.选择图片区域,点击提交,保 ...
- IE6背景图片闪动问题
在IE6中,当JS触发事件时或者hover的时候,如果网速过慢 IE6背景图片重新加载会闪一下. 好的一个解决方案是 <!--[if IE 6]><script> try{do ...
- 以中断方式实现1s定时
中断方式比较特殊,需要使用单片机内部的中断处理机制,同时指定中断函数. #include <reg52.h> sbit LED = P0^; unsigned ; void main() ...
- MVC + JQUERY + AJAX
- zzuli oj 1165 实数的小数部分(指针专题)
Description 读入一个实数,输出该实数的小数部分,小数部分若多余的末尾0,请去掉.如输入111111.12345678912345678900 则输出0.12345678912345678 ...
- iOS - 发送邮件
IOS系统框架提供的两种发送Email的方法:openURL 和 MFMailComposeViewController.借助这两个方法,我们可以轻松的在应用里加入如用户反馈这类需要发送邮件的功能. ...
- [原博客] BZOJ 1257 [CQOI2007] 余数之和
题目链接题意: 给定n,k,求 ∑(k mod i) {1<=i<=n} 其中 n,k<=10^9. 即 k mod 1 + k mod 2 + k mod 3 + … + k mo ...