hdu 1102 (最小生成树kruskal算法--并查集,prim死活过不了)
2013-11-13 12:50
489 查看
http://acm.hdu.edu.cn/showproblem.php?pid=1102
#include"stdio.h"
#include"algorithm"
#include"iostream"
#include"string.h"
using namespace std;
typedef struct node
{
int v1,v2;
int length;
}node;
node bian[6000];
int father[110],k;
bool cmp(node a,node b)
{
if(a.length<b.length)
return true;
return false;
}
int search(int x)//寻找父亲结点
{
while(father[x]!=x)
x = father[x];
return father[x];
}
int n;
void kulusi()//郁闷了 用prime算法死活过不了
{
int i,length;
for(i=1;i<=n;i++) father[i] = i;
length = 0;
for(i=0;i<k;i++)
{
if(search(bian[i].v1)!=search(bian[i].v2))//如果两个点的父亲结点相同的话就相通不用修路了
{
length += bian[i].length;
father[search(bian[i].v1)] = bian[i].v2;
}
}
printf("%d\n",length);
}
int main()
{
int i,j,q,a,b,tmp;
while(~scanf("%d",&n)){
k=0;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++){
scanf("%d",&tmp);
if(j>=i){
bian[k].v1 = i;
bian[k].v2 = j;
bian[k].length = tmp;
k++;
}
}
scanf("%d",&q);
for(i=0;i<q;i++){
scanf("%d%d",&a,&b);
bian[k].v1=a;
bian[k].v2=b;
bian[k].length = 0;
k++;
}
sort(bian,bian+k,cmp);
kulusi();
}
return 0;
}
/*
3
0 990 692
990 0 179
692 179 0
1
1 2
3
0 990 692
990 0 179
692 179 0
0
*/
#include"stdio.h"
#include"algorithm"
#include"iostream"
#include"string.h"
using namespace std;
typedef struct node
{
int v1,v2;
int length;
}node;
node bian[6000];
int father[110],k;
bool cmp(node a,node b)
{
if(a.length<b.length)
return true;
return false;
}
int search(int x)//寻找父亲结点
{
while(father[x]!=x)
x = father[x];
return father[x];
}
int n;
void kulusi()//郁闷了 用prime算法死活过不了
{
int i,length;
for(i=1;i<=n;i++) father[i] = i;
length = 0;
for(i=0;i<k;i++)
{
if(search(bian[i].v1)!=search(bian[i].v2))//如果两个点的父亲结点相同的话就相通不用修路了
{
length += bian[i].length;
father[search(bian[i].v1)] = bian[i].v2;
}
}
printf("%d\n",length);
}
int main()
{
int i,j,q,a,b,tmp;
while(~scanf("%d",&n)){
k=0;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++){
scanf("%d",&tmp);
if(j>=i){
bian[k].v1 = i;
bian[k].v2 = j;
bian[k].length = tmp;
k++;
}
}
scanf("%d",&q);
for(i=0;i<q;i++){
scanf("%d%d",&a,&b);
bian[k].v1=a;
bian[k].v2=b;
bian[k].length = 0;
k++;
}
sort(bian,bian+k,cmp);
kulusi();
}
return 0;
}
/*
3
0 990 692
990 0 179
692 179 0
1
1 2
3
0 990 692
990 0 179
692 179 0
0
*/
相关文章推荐
- 24-JavaScript-面向对象-案例-移动mario图片
- 如果数据表中‘Id’为主键,如何利用数据库自带工具导入数据呢
- ASP.NET与前台交互--即后台.cs文件与前台.aspx文件交互
- Android中ViewFlipper详解
- 校验码
- 理解架构、框架与设计模式
- 04-Windows Server 2012 R2 会话远程桌面-标准部署-CA证书(RemoteApp) 推荐
- java 已知两个地点经纬度算距离(非常精确)
- 于彤,女,98岁,中国10大名老中医的养生理念
- BroadcastReceiver
- ColorComboBox
- ssh整合案例
- 如何用busybox制作一个自己文件系统
- 获取本周第一天/最后一天、本月第一天/最后一天的时间戳
- js获取项目的根目录
- linux c printf 的缓冲输出
- 猜生日算法
- OfficePickers
- Win2008学习(三),文件服务器群集
- Android开发之日历控件实现