HDU 3371 kruscal/prim求最小生成树 Connect the Cities 大坑大坑
这个时间短 700多s
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
using namespace std;
struct node{
int u;
int v;
int w;
}que[100000];
int father[505];
bool cmp(struct node a,struct node b){
return a.w<b.w;
}
void init(int n){
for(int i=1;i<=n;i++)
father[i]=i;
}
int find(int u){
if(father[u]!=u)
father[u]=find(father[u]);
return father[u];
}
int main(){
int t;
scanf("%d",&t);
while(t--){
int n,m,k;
int edge=0,sum=0;
scanf("%d%d%d",&n,&m,&k);
init(n);
for(int i=0;i<m;i++){
scanf("%d%d%d",&que[i].u,&que[i].v,&que[i].w);
}
sort(que,que+m,cmp);
for(int i=1;i<=k;i++){
int cnt,root;
scanf("%d%d",&cnt,&root);
for(int j=1;j<cnt;j++){
int x;
scanf("%d",&x);
int c1=find(x),c2=find(root);
if(c1!=c2){
father[c1]=c2;
}
}
}
for(int i=1;i<=n;i++)
if(father[i]==i)
edge++;
bool flag=false;
for(int i=0;i<m;i++){
int tx=find(que[i].u),ty=find(que[i].v);
if(tx!=ty){
father[tx]=ty;
sum+=que[i].w;
edge--;
}
if(edge==1){
flag=true;
break;
} }
if(flag)
printf("%d\n",sum);
else
printf("-1\n"); }
return 0;
}
Connect the Cities
Time Limit: 1000 MS Memory Limit: 32768 KB
64-bit integer IO format: %I64d , %I64u Java class name: Main
Description
Input
Each
test case starts with three integers: n, m and k. n (3 <= n
<=500) stands for the number of survived cities, m (0 <= m <=
25000) stands for the number of roads you can choose to connect the
cities and k (0 <= k <= 100) stands for the number of still
connected cities.
To make it easy, the cities are signed from 1 to n.
Then follow m lines, each contains three integers p, q and c (0 <= c <= 1000), means it takes c to connect p and q.
Then
follow k lines, each line starts with an integer t (2 <= t <= n)
stands for the number of this connected cities. Then t integers follow
stands for the id of these cities.
Output
Sample Input
1
6 4 3
1 4 2
2 6 1
2 3 5
3 4 33
2 1 2
2 1 3
3 4 5 6
Sample Output
1
Source
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
using namespace std;
struct node{
int u,v,w;
}que[105000];
int father[505];
bool cmp( node a, node b){
return a.w<b.w;
}
void init(int n){
for(int i=1;i<=n;i++)
father[i]=i;
}
int find(int u){
if(father[u]!=u){
father[u]=find(father[u]);
}
return father[u];
} int main(){
int t;
scanf("%d",&t);
while(t--){
int n,m,k;///
int sum,edge;//这些变量我一定义在外部就会超时,只能定义在内部,那样也是飘过,980多s,好险好险
int uu,vv,ww;
scanf("%d%d%d",&n,&m,&k);
init(n);
for(int i=0;i<m;i++){
scanf("%d%d%d",&uu,&vv,&ww);
que[i].u=uu;
que[i].v=vv;
que[i].w=ww;
}
sort(que,que+m,cmp);
int x,zz,dd;
for(int i=1;i<=k;i++){
scanf("%d%d",&x,&zz);
for(int j=1;j<x;j++){
scanf("%d",&dd);
int c1=find(zz),c2=find(dd);
if(c1!=c2)
father[c2]=c1;
}
}
edge=0;
for(int i=1;i<=n;i++){
if(father[i]==i)
edge++;
}//此时只需要判断还有几个相等,其中另一个含义就是看这些个点分成了几堆,不妨设为k堆,那么只需要k-1条线便可以将其他的点连接在一起,即其他的堆
sum=0;
bool flag=false;
for(int i=0;i<m;i++){
int a1=find(que[i].u);
int a2=find(que[i].v);
if(a1!=a2){
father[a1]=a2;
sum+=que[i].w;
edge--;
}
if(edge==1){
flag=true;
break;
}
} if(flag)
printf("%d\n",sum);
else
printf("-1\n");
}
return 0;
}
HDU 3371 kruscal/prim求最小生成树 Connect the Cities 大坑大坑的更多相关文章
- hdu 3371(prim算法)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3371 Connect the Cities Time Limit: 2000/1000 MS (Jav ...
- hdu 3371(启发式合并的最小生成树)
Connect the Cities Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Other ...
- POJ 1258 Agri-Net(Prim求最小生成树)
Agri-Net Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 64912 Accepted: 26854 Descri ...
- Codeforces 632F - Magic Matrix(暴力 bitset or Prim 求最小生成树+最小瓶颈路)
题面传送门 开始挖老祖宗(ycx)留下来的东西.jpg 本来想水一道紫题作为 AC 的第 500 道紫题的,结果发现点开了道神题. 首先先讲一个我想出来的暴力做法.条件一和条件二直接扫一遍判断掉.先将 ...
- prim求最小生成树
一直以来只会Kruskal prim和dijkstra很像 只不过prim维护的是最短的边,而dijkstra维护的是最短的从起点到一个点的路径 同时prim要注意当前拓展的边是没有拓展过的 可以用堆 ...
- Kruscal算法求图的最小生成树
Kruscal算法求图的最小生成树 概述 和Prim算法求图的最小生成树一样,Kruscal算法求最小生成树也用到了贪心的思想,只不过前者是贪心地选择点,后者是贪心地选择边.而且在算法的实现中,我 ...
- 新疆大学(新大)OJ xju 1009: 一带一路 prim求最短路径+O(n)素数筛选
1009: 一带一路 时间限制: 1 Sec 内存限制: 128 MB 题目描述 一带一路是去去年习大大提出来的建设“新丝绸之路经济带”和“21世纪海上丝绸之路”的战略构想.其中就包括我们新疆乌鲁木 ...
- HDU 3371 Connect the Cities(prim算法)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3371 Problem Description In 2100, since the sea leve ...
- hdu 3371 Connect the Cities(最小生成树)
题目:http://acm.hdu.edu.cn/showproblem.php?pid=3371 984ms风险飘过~~~ /************************************ ...
随机推荐
- jQuery应用之(三)jQuery链
从前文的实例中,我们按到jQuery语句可以链接在一起,这不仅可以缩短代码长度,而且很多时候可以实现特殊的效果. <script type="text/javascript" ...
- RESTful WebService入门(转)
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://lavasoft.blog.51cto.com/62575/229206 REST ...
- nginx下禁止访问robots.txt的设置方法
关于robots.txt文件:搜索引擎通过一种程序robot(又称spider),自动访问互联网上的网页并获取网页信 息.您可以在您的网站中创建一个纯文本文件robots.txt,在这个文件中声明该网 ...
- 扩展KMP
刘雅琼论文 http://wenku.baidu.com/view/8e9ebefb0242a8956bece4b3.html 论文讲的非常详细. 给定母串S,子串T,n=strlen(S),m=st ...
- 【CodeForces 626E】Simple Skewness
题意 给出n个数的集合,求一个 (平均数-中位数)最大 (偏度最大)的子集,输出子集元素个数和各个元素(任意顺序). 分析 因为是子集,所以不一定是连续的序列.然后我们有下面几个结论. 1.最大偏度一 ...
- UVA10118(记忆化搜索 + 好题)
http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=19440 题意,4堆不同颜色的糖果,每堆N个,从堆上往下拿,放入一个最大装5个 ...
- std::shared_ptr
在std::shared_ptr被引入之前,C++标准库中实现的用于管理资源的智能指针只有std::auto_ptr一个而已.std::auto_ptr的作用非常有限,因为它存在被管理资源的所有权转移 ...
- ResultSet
在Java中,获得ResultSet的总行数的方法有以下几种. 第一种:利用ResultSet的getRow方法来获得ResultSet的总行数 Java代码Statement stmt = con. ...
- myBatis 实现用户表增删查改操作<方法2 加入接口>(最终版)
这2种方法的区别:1.添加接口 2.运用接口来实现 其他的都一样 添加接口 //接口的名字和xml的名字一样,这样xml中的namespace就不用改 public interface UserMap ...
- &#x开头的是什么编码呢。浏览器可以解释它。如中国等同与中文"中国"?
形如—— &#dddd; &#xhhhh; &#name; ——的一串字符是 HTML.XML 等 SGML 类语言的转义序列(escape sequence).它们不是「编码 ...