POJ1287(最小生成树入门题)
| Time Limit: 1000MS | Memory Limit: 10000K | |
| Total Submissions: 7753 | Accepted: 4247 |
Description
Your task is to design the network for the area, so that there is a connection (direct or indirect) between every two points (i.e., all the points are interconnected, but not necessarily by a direct cable), and that the total length of the used cable is minimal.
Input
The maximal number of points is 50. The maximal length of a given route is 100. The number of possible routes is unlimited. The nodes are identified with integers between 1 and P (inclusive). The routes between two points i and j may be given as i j or as j i.
Output
Sample Input
1 0 2 3
1 2 37
2 1 17
1 2 68 3 7
1 2 19
2 3 11
3 1 7
1 3 5
2 3 89
3 1 91
1 2 32 5 7
1 2 5
2 3 7
2 4 8
4 5 11
3 5 10
1 5 6
4 2 12 0
Sample Output
0
17
16
26
赤裸裸的最小生成树问题,下面用三种方式分别实现。
/*
Kruskal 1287 Accepted 420K 16MS G++
*/
#include"cstdio"
#include"algorithm"
using namespace std;
const int MAXN=;
struct Edge{
int u,v,cost;
}es[MAXN];
bool comp(const Edge &a,const Edge &b)
{
return a.cost < b.cost;
} int par[MAXN];
int rnk[MAXN];
void init(int n)
{
for(int i=;i<=n;i++)
{
par[i]=i;
}
} int fnd(int x)
{
if(par[x]==x)
{
return x;
}
return par[x]=fnd(par[x]);
} void unite(int u,int v)
{
int a=fnd(u);
int b=fnd(v);
if(a==b) return ; if(rnk[a]<rnk[b])
{
par[a]=b;
}
else{
par[b]=a;
if(rnk[a]==rnk[b]) rnk[a]++;
}
} bool same(int u,int v)
{
return fnd(u)==fnd(v);
} int main()
{
int V,E;
while(scanf("%d",&V)!=EOF&&V)
{
scanf("%d",&E);
for(int i=;i<E;i++)
{
scanf("%d%d%d",&es[i].u,&es[i].v,&es[i].cost);
}
sort(es,es+E,comp);
init(V);
int ans=;
int cnt=;
for(int i=;i<E;i++)
{
if(!same(es[i].u,es[i].v))
{
unite(es[i].u,es[i].v);
ans+=es[i].cost;
cnt++;
}
if(cnt==V-) break;
}
printf("%d\n",ans);
}
return ;
}
/*
Prim 1287 Accepted 408K 16MS G++
*/
#include"cstdio"
using namespace std;
const int MAXN=;
const int INF=0x3fffffff;
int mp[MAXN][MAXN];
int V,E;
inline int min(int a,int b)
{
return a>b?b:a;
}
int d[MAXN];
int vis[MAXN];
int prim(int s)
{
int ans=;
for(int i=;i<=V;i++)
{
d[i]=mp[s][i];
vis[i]=;
}
d[s]=,vis[s]=;
for(int i=;i<=V-;i++)
{
int mincost,k;
mincost=INF; for(int i=;i<=V;i++)
{
if(!vis[i]&&mincost>d[i])
{
mincost=d[i];
k=i;
}
}
vis[k]=;
ans+=mincost;
for(int i=;i<=V;i++)
{
if(!vis[i]&&d[i]>mp[k][i])
{
d[i]=mp[k][i];
}
}
}
return ans;
} int main()
{
while(scanf("%d",&V)&&V)
{
for(int i=;i<=V;i++)
for(int j=;j<=V;j++)
if(i==j) mp[i][j]=;
else mp[i][j]=INF;
scanf("%d",&E);
for(int i=;i<E;i++)
{
int u,v,co;
scanf("%d%d%d",&u,&v,&co);
mp[u][v]=mp[v][u]=min(mp[u][v],co);
}
printf("%d\n",prim());
} return ;
}
/*
堆优化prim 1287 Accepted 604K 16MS G++
*/
#include"cstdio"
#include"cstring"
#include"queue"
using namespace std;
const int MAXN=;
const int INF=0x3fffffff;
struct Edge{
int to,cost,next;
}es[MAXN];
struct Node{
int d,u;
Node(int cd,int cu):d(cd),u(cu){ }
bool operator<(const Node& a) const
{
return d > a.d;
}
};
int V,E;
int head[];
int cnt;
void add_edge(int u,int v,int co)
{
es[cnt].to=v;
es[cnt].cost=co;
es[cnt].next=head[u];
head[u]=cnt;
cnt++;
}
int d[];
int vis[];
int prim(int s)
{
int ans=;
for(int i=;i<=V;i++)
{
vis[i]=;
d[i]=INF;
}
d[s]=;
priority_queue<Node> que;
que.push(Node(,s));
while(!que.empty())
{
Node no=que.top();que.pop();
int v=no.u;
if(vis[v]) continue;
ans+=no.d;
vis[v]=;
for(int i=head[v];i!=-;i=es[i].next)
{
Edge e=es[i];
if(d[e.to]>e.cost)
{
d[e.to]=e.cost;
que.push(Node(d[e.to],e.to));
}
}
}
return ans;
}
int main()
{
while(scanf("%d",&V)&&V)
{
cnt=;
memset(head,-,sizeof(head));
scanf("%d",&E);
for(int i=;i<E;i++)
{
int u,v,co;
scanf("%d%d%d",&u,&v,&co);
add_edge(u,v,co);
add_edge(v,u,co);
} int ans=prim();
printf("%d\n",ans);
}
return ;
}
POJ1287(最小生成树入门题)的更多相关文章
- hdu 3695:Computer Virus on Planet Pandora(AC自动机,入门题)
Computer Virus on Planet Pandora Time Limit: 6000/2000 MS (Java/Others) Memory Limit: 256000/1280 ...
- poj 2524:Ubiquitous Religions(并查集,入门题)
Ubiquitous Religions Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 23997 Accepted: ...
- poj 3984:迷宫问题(广搜,入门题)
迷宫问题 Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 7635 Accepted: 4474 Description ...
- hdu 1754:I Hate It(线段树,入门题,RMQ问题)
I Hate It Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total S ...
- poj 3254 状压dp入门题
1.poj 3254 Corn Fields 状态压缩dp入门题 2.总结:二进制实在巧妙,以前从来没想过可以这样用. 题意:n行m列,1表示肥沃,0表示贫瘠,把牛放在肥沃处,要求所有牛不能相 ...
- zstu.4194: 字符串匹配(kmp入门题&& 心得)
4194: 字符串匹配 Time Limit: 1 Sec Memory Limit: 128 MB Submit: 206 Solved: 78 Description 给你两个字符串A,B,请 ...
- hrbustoj 1073:病毒(并查集,入门题)
病毒Time Limit: 1000 MS Memory Limit: 65536 KTotal Submit: 719(185 users) Total Accepted: 247(163 user ...
- hdu 1465:不容易系列之一(递推入门题)
不容易系列之一 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Sub ...
- hrbustoj 1545:基础数据结构——顺序表(2)(数据结构,顺序表的实现及基本操作,入门题)
基础数据结构——顺序表(2) Time Limit: 1000 MS Memory Limit: 10240 K Total Submit: 355(143 users) Total Accep ...
随机推荐
- android 5.0 默认水波纹背景属性,可设置不论什么View
actionBarItemBackground 5.0以上超出边界圆形水波纹 selectableItemBackground 5.0以上边界内圆形水波纹 这两个属性在5.0下面是默认的灰色效果 ...
- 输入两手牌,两手牌之间用“-”连接,每手牌的每张牌以空格分隔,“-”两边没有空格,如:4 4 4 4-joker JOKER 请比较两手牌大小,输出较大的牌,如果不存在比较关系则输出ERROR
// ConsoleApplication10.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream& ...
- JavaScript读书笔记(5)-Object Date
1.Object类型 (1)创建Object实例 第一种方式:new操作符后跟Object构造函数 var person=new Object(); person.name=”Nicholas”; p ...
- html中文件类型的accept属性有哪些
*.3gpp audio/3gpp, video/3gpp 3GPP Audio/Video *.ac3 audio/ac3 AC3 Audio *.asf allpication/vnd.ms-as ...
- Inno Setup 使用笔记
使 用 笔 记https://blog.csdn.net/dongshibo12/article/details/79095971 1.Inno Setup 是什么?Inno Setup 是一个免费的 ...
- 【转载】【selenium+Python WebDriver】之元素定位
总结: 感谢: “煜妃”<Selenuim+Python之元素定位总结及实例说明> “Huilaojia123”<selenium WebDriver定位元素学习总结> “上海 ...
- 【虚拟机】WIN8.1系统安装虚拟机win7环境
一.虚拟机的安装 1.准备 VMware Workstation 的软硬件支持,请查看 http://www.vmware.com/cn/products/workstation.html#techs ...
- Linux的经常使用命令(1) - 指定执行级别
命令:init [0123456] 执行级别 0:关机 1:单用户 2:多用户状态没有网络服务 3:多用户状态有网络服务 4:系统未使用保留给用户 5:图形界面 6:系统重新启动 经常使用执行级别是3 ...
- Python中类方法、__new__方法和__init__方法解析
在编程语言中创建一个类,有构造方法这样的一个术语.而在Python中,通常大家都认为__init__是构造方法,其实并不完全等同.在构建类中,有一个特殊的方法__new__,这个才能等同为构造方法. ...
- rabbitmq 安装-单点
centos6.5 rabbitmq搭建 环境:centos6.5 192.168.9.41 安装rabbitmq需要先安装erlang.rabbitmq3.6版本需要erlang R16B03 ...