Jungle Roads
2013-10-15 21:48
302 查看
poj1251:http://poj.org/problem?id=1251
题意:求n个村庄之间的最小生成树。
题解:建好图,然后之间kruska直接解题。
View Code
题意:求n个村庄之间的最小生成树。
题解:建好图,然后之间kruska直接解题。
#include<iostream> #include<cstring> #include<cstdio> #include<algorithm> using namespace std; int n,num,k,cnt,sum,tt,next1; char s1,s2; int pa[28]; struct Node{ int u; int v; int w; bool operator<(const Node &a)const{ return w<a.w; } }edge[1000]; void UFset(){//初始化 for(int i=1;i<=n;i++) pa[i]=-1; } int Find(int x){//查找 int s; for(s=x;pa[s]>=0;s=pa[s]); while(s!=x){ int temp=pa[x]; pa[x]=s; x=temp; } return s; } void Union(int R1,int R2){//合并 int r1=Find(R1); int r2=Find(R2); int temp=pa[r1]+pa[r2]; if(pa[r1]>pa[r2]){ pa[r1]=r2; pa[r2]=temp; } else{ pa[r2]=r1; pa[r1]=temp; } } void kruska(){//求最小生成树 UFset(); num=0;sum=0; for(int i=1;i<cnt;i++){ int u=edge[i].u; int v=edge[i].v; if(Find(u)!=Find(v)){ num++; sum+=edge[i].w; Union(u,v); } if(num>=n-1)break; } printf("%d\n",sum); } int main(){ while(~scanf("%d",&n)&&n){ cnt=1; for(int i=1;i<n;i++){ //scanf("%c%d",s1,&tt);//注意 %c会把空格也会读进去 cin>>s1>>tt; for(int j=1;j<=tt;j++){//建图 //scanf("%c %d",s2,&next1); cin>>s2>>next1; edge[cnt].u=s1-'A'+1; edge[cnt].v=s2-'A'+1; edge[cnt++].w=next1; } } sort(edge+1,edge+cnt);//排序 kruska(); } }
View Code
相关文章推荐
- windows server 2008 r2的FTP配置和访问
- C语言中头文件是如何包含的?也说重定义
- 敏捷软件之弊
- 截断上传原理(转载加自己实验)
- python,xml,dom,tree,parser,soup,beautiful soup
- 撰写商业计划书
- So cute are you Python 8
- Spring.Net 技术简介 IOC and DI
- Extjs 继承Ext.Component自定义组件
- UVALive 4670 Dominating Patterns(AC自动机模板题)
- 安卓应用退出的实现 推荐
- [树Dfs][Usaco2010 Mar]gather奶牛大集会
- UVA 11468 Substring(AC自动机 + dp)
- Contiki基础之一
- 怎样拟定创业计划书
- const读书笔记
- windows环境下apache httpd.conf配置以及采用apache加载php
- 学习面向对象之异常之三
- java中方法的控制修饰符也分为:可访问控制符和非访问控制符两类。
- oradebug hanganalyze