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 ...
随机推荐
- Spring MVC学习纲要
感慨一下 之前用过Spring MVC, MyBatis,但是很久不用之后发现很多知识点都荒废了,毕竟工作就是重复,重复再重复.没有啥新东西.所以还是找个时间把忘了的东西捡起来.万一搞了个大bug,然 ...
- linux环境tomcat配置及hadoop 2.6伪分布模式安装配置
一.ubuntu 15.04.openjdk1.7.tomcat7环境配置 1. 配置openjdk1.7,输入命令: -jdk 2. 查看java是否安装成功,输入命令: envjava -vers ...
- 【BZOJ3745】[Coci2015]Norma cdq分治
[BZOJ3745][Coci2015]Norma Description Input 第1行,一个整数N: 第2~n+1行,每行一个整数表示序列a. Output 输出答案对10^9取模后的结果. ...
- 马尔科夫链在第n步转移的状态的概率分布
- 【shell】awk引用外部变量
在使用awk的过程中,经常会需要引用外部变量,但是awk需要使用单引号将print包起来,导致print后的$引用无效,可以采用下面的方式 例如: #!/bin/bash a="line1 ...
- Mac OS X 下查看和设置JAVA_HOME
原文链接 : http://blog.csdn.net/done58/article/details/51138057 1, 查看Java版本 打开Mac电脑,查看JAVA版本,打开终端Termina ...
- 去js校验
1.首先,找到项目所在的路径 2.关掉eclipse,找到项目文件 3.打开.project
- blog真正的首页
声明:此Django分类下的教程是追梦人物所有,地址http://www.jianshu.com/u/f0c09f959299,本人写在此只是为了巩固复习使用 上一节我们阐明了django的开发流程, ...
- ubuntu gitlab服务器搭建
gitlab服务器搭建 1.安装依赖包 sudo apt-get install curl openssh-server ca-certificates postfix 执行完成后,出现邮件配置,选择 ...
- matlab之text()函数
text()函数用来给图加上说明性文字. 格式:text(x,y,'txt') 或者:text(x,y,'txt','color','k') x,y是位置 txt是说明文字,如果说明性文字是数字,则这 ...