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风险飘过~~~ /************************************ ...
随机推荐
- [BZOJ 1297][SCOI 2009]迷路(矩阵快速幂)
题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1297 分析:如果每条边的边权都是1,那么就相当于对邻接矩阵自乘T次(因为写一下递推式子 ...
- linux中的帮助命令
关键字 man --help help 1.man (1)查看命令 man 命令用来查看别的命令的信息和用法,如man ls表示查看ls的介绍以及用法: (2)查看配置文件的帮助文档 linux下的配 ...
- EntityFramework_MVC4中EF5 新手入门教程之一 ---1.创建实体框架数据模型
Contoso University Web 应用程序 你会在这些教程中构建的应用程序是一个简单的大学网站. 用户可以查看和更新学生. 课程和教师信息.这里有几个屏幕,您将创建. 这个网站的用户界面 ...
- Bootstrap3.0学习第十四轮(分页、徽章)
详情请查看http://aehyok.com/Blog/Detail/21.html 个人网站地址:aehyok.com QQ 技术群号:206058845,验证码为:aehyok 本文文章链接:ht ...
- iOS---cell-自适应高度
RootViewController: // // RootViewController.m // UI__cell自适应高度 // // Created by dllo on 16/3/15. // ...
- 一条命令使win7可以直接运行.net3.5程序
dism /online /get-features 获取 功能名称 dism /online /enable-feature /featurename:NetFx3 启用win7自带的.net f ...
- oracle-3-子查询和常用函数
主要内容: >子查询 >伪例 >锁的概念 >>>1.子查询 子查询在SELECT ,UPDATE ,DELETE 语句内部可以出现SELECT 语句,内部的SELE ...
- Asp.Net MVC 中实现跨域访问
在ASP.Net webapi中可以使用 Microsoft.AspNet.WebApi.Cors 来实现: public static class WebApiConfig { public s ...
- 【HDU 5363】Key Set
题 Description soda has a set $S$ with $n$ integers $\{1, 2, \dots, n\}$. A set is called key set if ...
- 常用sql,在做项目时用mysqlWorkBeach里面自动生成的
-- 修改表中的字段的长度ALTER TABLE `sfkbbs`.`sfk_father_module` CHANGE ) NULL DEFAULT NULL COMMENT '父板块名字' ; 在 ...