用Kruskal算法解POJ 1251 Jungle Roads代码
2016-01-23 13:24
260 查看
#include<stdio.h> #include<algorithm> using namespace std; struct road{ int x,y,price; //price表示连接 x,y村庄的公路维修费用 }; int cmp(road a,road b){ return a.price<b.price; } int deal(int n){ int i,j,k=0,q,p,root[27],js=1,total=0; //k--总边数 q--每一行边数 p--费用 root[]表示根 total--最少费用 road s[80]; char a,b; //a--x, b--y for(i=0;i<n-1;i++){ scanf("\n%c %d ",&a,&q); for(j=0;j<q;j++){ scanf("%c %d ",&b,&p); s[k].x=a-'A', s[k].y=b-'A', s[k++].price=p; //root[b-'A']=a-'A'; } } sort(s,s+k,cmp); //将边数按从小到大排序 for(i=0;i<n;i++) //采用Kruskal算法 每个点指向自己 root[i]=i; /*for(i=0;i<k;i++) //输出查看 printf("%d--%d %d ",s[i].x,s[i].y,s[i].price); printf("\n"); for(i=0;i<n;i++) printf("%d->%d ",i,root[i]); printf("\n--------------------------------\n");*/ int w; for(i=0;i<k&&js<n;i++) if(root[s[i].x]!=root[s[i].y]){ total+=s[i].price; root[root[s[i].y]]=root[s[i].x]; //合并两棵树 for(j=0;j<n;j++){ //更新祖先节点 w=j; while(root[w]!=w) w=root[w]; root[j]=w; } js++; } return total; } int main(){ int n,i,t=1,z[101]; //freopen("Jungle Roads.out","w",stdout); //文件输出 scanf("%d",&n); while(n!=0){ z[t++]=deal(n); //z[t]表示每次处理后的费用 scanf("%d",&n); } for(i=1;i<t;i++) printf("%d\n",z[i]); return 0; }
相关文章推荐
- POJ 1456 Supermarket(贪心)
- C#添加测量运行时间
- C++学习笔记(一) C++介绍
- Java线程池,多线程编程
- JAVA之 jdk 的配置
- php类库安装xml
- SpringMVC中@ResponseBody注解返回json中文乱码问题
- C++Primer第5版学习笔记(二)
- leetcode之Odd Even Linked List
- Struts2--思维导图
- VS插件,好用,提高代码效率。Productivity Power Tools
- Ubuntu安装Java
- Dijkstra Algorithm 实现
- Java线程--思维导图
- 提高 ASP.NET Web 应用性能的 24 种方法和技巧
- Java IO流
- C++四种智能指针小结
- php CURL 调用Webservices专题
- vim任意目录下执行php命令
- ASPxGridView控件常用示例五:显示Detail数据