VIJOS P1234 口袋的天空 Accepted
来源:互联网 发布:python量化投资 视频 编辑:程序博客网 时间:2024/05/16 15:16
思路很简单,用kruskal算法生成最小生成森林。kruskal用并查集实现。用堆优化一下才能过。
#include<stdio.h>
//disjointset
int rank[1001],set[1001];
void Makeset(int x)
...{
set[x]=x;
rank[x]=0;
}
int Find(int x)
...{
if(set[x]!=x)
set[x]=Find(set[x]);
return set[x];
}
void Link(int x,int y)
...{
if(rank[x]>rank[y])
set[y]=x;
else...{
set[x]=y;
if(rank[x]==rank[y]) rank[y]++;
}
}
void Union(int x,int y)
...{
Link(Find(x),Find(y));
}
//disjointset end
typedef struct e
...{
int a,b,w;
}Edge;
Edge E[10001];
//MinHeap
int heapsize;
void heapify(int i)
...{
int l=i<<1;
int r=(i<<1) + 1;
int smallest;
if(l<heapsize && E[l].w<E[i].w) smallest=l;
else smallest=i;
if(r<heapsize && E[r].w<E[smallest].w) smallest=r;
if(smallest!=i) ...{
Edge tmp;
tmp=E[i];
E[i]=E[smallest];
E[smallest]=tmp;
heapify(smallest);
}
}
void Build(void)
...{
int i;
for(i=heapsize>>1;i>0;i--) heapify(i);
}
Edge Extract(void)
...{
Edge t;
t=E[1];
E[1]=E[heapsize];
heapsize--;
heapify(1);
return t;
}
//min heap end
int n,m,k;
int main(void)
...{
int i;
long cost=0;
Edge tmp;
FILE *fin=stdin;
fscanf(fin,"%d %d %d ",&n,&m,&k);
heapsize=m;
for(i=1;i<=m;i++)
fscanf(fin,"%d %d %d",&E[i].a,&E[i].b,&E[i].w);
Build();
for(i=1;i<=n;i++) Makeset(i);
for(i=n;i>k && heapsize;)...{
tmp=Extract();
if(Find(tmp.a)!=Find(tmp.b))...{
Union(tmp.a,tmp.b);
cost+=tmp.w;
i--;
}else continue;
}
if (i>k) printf("No Answer ");
else printf("%d ",cost);
return 0;
}
//disjointset
int rank[1001],set[1001];
void Makeset(int x)
...{
set[x]=x;
rank[x]=0;
}
int Find(int x)
...{
if(set[x]!=x)
set[x]=Find(set[x]);
return set[x];
}
void Link(int x,int y)
...{
if(rank[x]>rank[y])
set[y]=x;
else...{
set[x]=y;
if(rank[x]==rank[y]) rank[y]++;
}
}
void Union(int x,int y)
...{
Link(Find(x),Find(y));
}
//disjointset end
typedef struct e
...{
int a,b,w;
}Edge;
Edge E[10001];
//MinHeap
int heapsize;
void heapify(int i)
...{
int l=i<<1;
int r=(i<<1) + 1;
int smallest;
if(l<heapsize && E[l].w<E[i].w) smallest=l;
else smallest=i;
if(r<heapsize && E[r].w<E[smallest].w) smallest=r;
if(smallest!=i) ...{
Edge tmp;
tmp=E[i];
E[i]=E[smallest];
E[smallest]=tmp;
heapify(smallest);
}
}
void Build(void)
...{
int i;
for(i=heapsize>>1;i>0;i--) heapify(i);
}
Edge Extract(void)
...{
Edge t;
t=E[1];
E[1]=E[heapsize];
heapsize--;
heapify(1);
return t;
}
//min heap end
int n,m,k;
int main(void)
...{
int i;
long cost=0;
Edge tmp;
FILE *fin=stdin;
fscanf(fin,"%d %d %d ",&n,&m,&k);
heapsize=m;
for(i=1;i<=m;i++)
fscanf(fin,"%d %d %d",&E[i].a,&E[i].b,&E[i].w);
Build();
for(i=1;i<=n;i++) Makeset(i);
for(i=n;i>k && heapsize;)...{
tmp=Extract();
if(Find(tmp.a)!=Find(tmp.b))...{
Union(tmp.a,tmp.b);
cost+=tmp.w;
i--;
}else continue;
}
if (i>k) printf("No Answer ");
else printf("%d ",cost);
return 0;
}
- VIJOS P1234 口袋的天空 Accepted
- Vijos P1234 口袋的天空
- |Vijos|图论生成树|P1234 口袋的天空
- vijos 口袋的天空
- vijos 1234 口袋的天空
- 口袋的天空
- NSU-1483-口袋的天空
- 洛谷 1195 口袋的天空
- 洛谷 P1195 口袋的天空
- 洛谷 P1195 口袋的天空
- 洛谷 P1195 口袋的天空
- 洛谷P1195 口袋的天空
- 洛谷1195口袋的天空
- 口袋的天空(洛谷 P1195)
- kruskal算法应用——口袋的天空
- P1195 口袋的天空(并查集+Kruskal)
- 洛谷 1195 口袋的天空 最小生成树 解题报告
- VIJOS P1119 (NOIP2001 Problem4):Car的旅行路线 Accepted
- 关于SQL导入导出的方法大全(从网上摘抄)
- 参数自动选择引用类型还是值类型
- Mysql数据库远程不能连的2个主要原因
- 关于游戏中玩家间的互动
- MySQL数据库配置技巧
- VIJOS P1234 口袋的天空 Accepted
- Strategy模式学习笔记
- VC常用开发技巧
- 2006年Java One大会10大Java SE 分会场
- 如何屏蔽掉 php一些函数?
- [号召] 大家去写自己学习SICP的心得呀!!
- 如何在网页中调用论坛帖子
- P,MTHBGWB
- eclipse下编辑国际化资源文件的方法