http://poj.org/problem?id=2377
bessie要为FJ的N个农场联网,给出M条联通的线路,每条线路需要花费C,因为意识到FJ不想付钱,所以bsssie想把工作做的很糟糕,她想要花费越多越好,并且任意两个农场都需要连通,并且不能存在环。后面两个条件保证最后的连通图是一棵树。
输出最小花费,如果没办法连通所有节点输出-1.
最大生成树问题,按边的权值从大道小排序即可,kruskal算法可以处理重边的情况,但是在处理的时候,不能仅仅因为两个节点在同一个连通子图就判断图不合法,只是不需要处理这条边,也就是不要加入并查集即可,重边也是一样。
所以只要判断图是否连通即可,但是也不能因为单单判断每个节点是否被访问过,因为就算全部被访问,还是可能不会连通。
只要判断加入并查集的边的条数是否等于n-1即可。上面都是自己开始做的没想清楚或者导致wa的,所以写下来作为自己的一点想法。
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std; struct edge
{
int u,v,cost;
edge() {}
edge(int x,int y,int z)
{
u=x;
v=y;
cost=z;
}
bool operator <(const edge& a) const
{
return cost>a.cost;
}
}; edge es[];
int par[];
int n,m;
void init()
{
for(int i=;i<=n;i++) par[i]=i;
} int find(int x)
{
return x==par[x]?x:par[x]=find(par[x]);
} void unite(int x,int y)
{
x=find(x);
y=find(y);
if(x!=y) par[x]=y;
} long long kruskal()
{
sort(es,es+m);
//for(int i=0;i<m;i++) printf("%d %d %d\n",es[i].u,es[i].v,es[i].cost);
long long sum=;
int count=;
for(int i=;i<m;i++)
{
edge e=es[i];
if(find(e.u)!=find(e.v))
{
unite(e.u,e.v);
count++;
sum+=e.cost;
}
}
if(count!=n-) sum=-;
return sum;
}
int main()
{
//freopen("a.txt","r",stdin);
int a,b,c;
while(~scanf("%d%d",&n,&m))
{
init();
for(int i=;i<m;i++)
{
scanf("%d%d%d",&a,&b,&c);
es[i]=edge(a,b,c);
}
printf("%lld\n",kruskal());
}
return ;
}
http://poj.org/problem?id=2395
bessie打算去其他农场,这里总共有N个农场,她开始在1号农场,然后有M条双向连通的路,并且可能还有重边,所有的农场都至少有一条路和1号农场相连。去其他农场需要水所以需要一个水袋,但是不知道需要准备多大的袋子,已知每走一公里就会消耗一单元的水,并且每到一个农场就可以补充水,让你找出任意两个农场中距离最长的路,这样就能知道最少需要准备多大的袋子来装水。
扯了这么多 就是在最小生成树中找出路径最长的那一条边,比上面一题还简单。
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std; struct edge
{
int u,v,cost;
edge() {}
edge(int x,int y,int z)
{
u=x;
v=y;
cost=z;
}
bool operator <(const edge& a) const
{
return cost<a.cost;
}
}; edge es[];
int par[];
int n,m;
void init()
{
for(int i=;i<=n;i++) par[i]=i;
} int find(int x)
{
return x==par[x]?x:par[x]=find(par[x]);
} void unite(int x,int y)
{
x=find(x);
y=find(y);
if(x!=y) par[x]=y;
} long long kruskal()
{
sort(es,es+m);
//for(int i=0;i<m;i++) printf("%d %d %d\n",es[i].u,es[i].v,es[i].cost);
long long sum=;
for(int i=;i<m;i++)
{
edge e=es[i];
if(find(e.u)!=find(e.v))
{
unite(e.u,e.v);
if(e.cost>sum) sum=e.cost;
}
}
return sum;
}
int main()
{
//freopen("a.txt","r",stdin);
int a,b,c;
while(~scanf("%d%d",&n,&m))
{
init();
for(int i=;i<m;i++)
{
scanf("%d%d%d",&a,&b,&c);
es[i]=edge(a,b,c);
}
printf("%lld\n",kruskal());
}
return ;
}
poj - 2377 Bad Cowtractors&&poj 2395 Out of Hay(最大生成树)的更多相关文章
-
poj 2377 Bad Cowtractors
题目连接 http://poj.org/problem?id=2377 Bad Cowtractors Description Bessie has been hired to build a che ...
-
poj 2377 Bad Cowtractors (最大生成树prim)
Bad Cowtractors Time Limit : 2000/1000ms (Java/Other) Memory Limit : 131072/65536K (Java/Other) To ...
-
POJ - 2377 Bad Cowtractors Kru最大生成树
Bad Cowtractors Bessie has been hired to build a cheap internet network among Farmer John's N (2 < ...
-
poj 2377 Bad Cowtractors(最大生成树!)
Description Bessie has been hired to build a cheap internet network among Farmer John's N (2 <= N ...
-
POJ 2377 Bad Cowtractors (Kruskal)
题意:给出一个图,求出其中的最大生成树= =如果无法产生树,输出-1. 思路:将边权降序再Kruskal,再检查一下是否只有一棵树即可,即根节点只有一个 #include <cstdio> ...
-
POJ 2377 Bad Cowtractors( 最小生成树转化 )
链接:传送门 题意:给 n 个点 , m 个关系,求这些关系的最大生成树,如果无法形成树,则输出 -1 思路:输入时将边权转化为负值就可以将此问题转化为最小生成树的问题了 /************* ...
-
POJ:2377-Bad Cowtractors
传送门:http://poj.org/problem?id=2377 Bad Cowtractors Time Limit: 1000MS Memory Limit: 65536K Total Sub ...
-
瓶颈生成树与最小生成树 POJ 2395 Out of Hay
百度百科:瓶颈生成树 瓶颈生成树 :无向图G的一颗瓶颈生成树是这样的一颗生成树,它最大的边权值在G的所有生成树中是最小的.瓶颈生成树的值为T中最大权值边的权. 无向图的最小生成树一定是瓶颈生成树,但瓶 ...
-
POJ 2395 Out of Hay(最小生成树中的最大长度)
POJ 2395 Out of Hay 本题是要求最小生成树中的最大长度, 无向边,初始化es结构体时要加倍,别忘了init(n)并查集的初始化,同时要单独标记使用过的边数, 判断ans==n-1时, ...
随机推荐
-
[JS]Cookie精通之路
[JS]Cookie精通之路 转http://blog.163.com/neu_pdh1983/blog/static/572407020077310528915/ 发布:Cary 媒体:www.Ju ...
-
AlwaysON同步过程
<SQL Server 2012实施与管理实战指南>中指AlwaysON同步过程如下: 任何一个SQL Server里都有个叫Log Writer的线程,当任何一个SQL用户提交一个数据修 ...
-
Chapter 16_2 继承
类也是对象,所有它们也可以从其他类获得方法.这就是“继承”,可以在Lua中表示: Account = { balance = } function Account:new(o) o = o or {} ...
-
zoj3710 friends(floyd变形)
Friends Time Limit: 2 Seconds Memory Limit: 65536 KB Alice lives in the country where people li ...
-
使用idea搭建Scala 项目
主要内容 Intellij IDEA开发环境简介 Intellij IDEA Scala开发环境搭建 Intellij IDEA常见问题及解决方案 Intellij IDEA常用快捷键 1. Inte ...
-
求复变函数的 Taylor 展式与 Laurent 展式[华中师范大学2010年复变函数复试试题]
设 $$\bex f(z)=\frac{1}{(z-1)(z-2)}. \eex$$ (1) 求 $f(z)$ 在 $|z|<1$ 内的 Taylor 展式. (2) 求 $f(z)$ 在圆环 ...
-
Java Enum 枚举类的values方法
Enum类和enum关键字定义的类型都有values方法,但是点进去会发现找不到这个方法.这是因为java编译器在编译这个类(enum关键字定义的类默认继承java.lang.Enum)的时候 自动插 ...
-
Confluence 6 Home 和其他重要的目录
Confluence 安装目录 Confluence 安装的目录(Confluence Installation directory)定义的是 Confluence 是在那里进行安装的.这个目录有时候 ...
-
Android 中的设计模式
1.单例模式 ContentProvider是单例模式,多个ContentResolver操作的都是同一个ContentProvider.
-
SharpZipLib 压缩ZIP导出
var uploadSectionDir = Path.Combine("Upload", "QQ", DateTime.Now.ToString(" ...