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风险飘过~~~ /************************************ ...
随机推荐
- [BZOJ1211][HNOI2004]树的计数(Prufer序列)
题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1211 分析: 关于无根树的组合数学问题肯定想到Prufer序列,类似bzoj1005那 ...
- [USACO2006][poj3182]The Grove(巧妙的BFS)
题目:http://poj.org/problem?id=3182 题意:一个棋盘中间有一个联通块,给你一个起点让你从起点开始绕联通块外围一圈并回到起点,求最小步数. 分析: 首先根据数据的范围比较小 ...
- FilenameFilter用法
使用FilenameFilter实现图片过滤,只要.gif,.jpg,.png文件. java 代码 public class ImageFilter implements FilenameFilte ...
- DELETE和DELETE FROM有什么区别
你如果只针对表进行删除,则一样. 但是如果需要联合其他表,则需要使用from 例如 delete tb1 from tb1 m where id in (select id from tb2) 我的习 ...
- mysql存储过程的学习
平时在工作中写过很多存储过程,但有时候对某些存储过程还是有些困惑的,所以发一篇文章记录下. 标准存储过程写法 create procedure`myQueryTask`( IN Task_No VAR ...
- Android Studio使用教程
http://blog.csdn.net/ryantang03/article/details/8948037 http://blog.csdn.net/ryantang03/article/deta ...
- Centos是什么
Linux是GNU/Linux的缩写,通常指各种Linux发行版的通称. 常见的Linux厂家主要有Redhat/Novell等. Redhat有两大Linux产品系列,其一是免费的Fedora Co ...
- Jquery的初识
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- ci中如何得到配置的url
$this->load->helper('url'); 然后,你可以用它查询并返回设置在config.php文件中的site和/或base URL: echo site_url(); ec ...
- html5新标签转
HTML 5 是一个新的网络标准,目标在于取代现有的 HTML 4.01, XHTML 1.0 and DOM Level 2 HTML 标准.它希望能够减少浏览器对于需要插件的丰富性网络应用服务(p ...