Connect the Cities(hdu3371)并查集(附测试数据)
Connect the Cities
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 7338 Accepted Submission(s): 2093
#include <iostream>
#include <cstdlib>
#include<algorithm>
using namespace std; int father[],Q; struct sum
{
int a;
int b;
int c;
}num[]; //路线数 bool cmp(const sum &x,const sum &y) //按长度从小到大快排,
{
return x.c<y.c;//原理有待研究
} int Find(int x) //找出祖先
{
while(x!=father[x])
x=father[x];
return x;
} void Union(int a,int b,int i)
{
if(a!=b)
{
father[a]=b;
Q+=num[i].c; //并入家族且把长度加上来
}
} int main()
{
int T,k,n,m,i,j,l,p,q,c,t;
int ss[];
scanf("%d",&T);
while(T--)
{
scanf("%d%d%d",&n,&m,&k);
for(i=;i<=n;i++)
father[i]=i;
for(i=;i<m;i++)
scanf("%d%d%d",&num[i].a,&num[i].b,&num[i].c);
memset(ss,,sizeof(ss));
for(l=;l<k;l++)
{
scanf("%d",&t);
for(j=;j<t;j++)
scanf("%d",&ss[j]);
for(j=;j<t;j++)
{
if(Find(ss[])!=Find(ss[j]))
father[Find(ss[j])]=Find(ss[]);
}
memset(ss,,sizeof(ss));
}
sort(num,num+m,cmp);//排序
for(i=,Q=;i<m;i++)
{
Union(Find(num[i].a),Find(num[i].b),i);
}
for(i=,t=;t<&&i<=n;i++)
if(father[i]==i)
t++;
if(t==)
printf("-1\n");
else
printf("%d\n",Q);
}
return ;
}
/*
5
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
6 4 3
1 4 3
2 6 2
6 2 1
3 4 33
2 1 2
2 1 3
3 4 5 6
6 4 3
1 4 2
2 6 1
2 3 5
3 4 33
2 1 2
2 2 3
2 4 5
6 4 3
1 4 3
2 6 2
6 2 1
3 4 33
2 1 2
2 1 3
2 4 6*/
在网上找了Kruskal函数, 有待学习!
#include<stdio.h> //Kruskal函数
#include<algorithm>
using namespace std; typedef struct{
int u;
int v;
int w;
}Edge; const int EdgeNum=;
const int PointNum=; Edge E[EdgeNum];
int P[PointNum]; int union_find(int x) // 并查集
{
return P[x]==x? x : P[x]=union_find(P[x]);
} bool cmp(Edge a,Edge b){ return a.w<b.w; } int MST_Kruskal(int n,int m) // 传入点数和边数
{
int i,j,x,y,k=,sum=;
for(i=;i<n;++i)
{
for(j=;j<n;++j)
{
if(i==j) continue;
if(P[j]==i)
{
k++;
// printf("P[%d]=%d\n",j,i);
}
}
}
// printf("k=%d\n",k);
sort(E,E+m,cmp);
for(i=;k<n&&i<m;++i)
{
x=union_find(E[i].u);
y=union_find(E[i].v);
if(x!=y)
{
sum+=E[i].w;
P[x]=y;
k++;
}
}
if(k<n) return -;
return sum;
} int f[];
int solve(int n,int m,int k)
{
int i,j,t;
for(i=;i<n;++i)
{ // 初始化并查集
P[i]=i;
}
for(i=;i<k;++i){
scanf("%d",&t);
for(j=;j<t;++j)
{
scanf("%d",&f[j]);
f[j]--;
}
for(j=;j<t;++j)
P[union_find(f[j])]=union_find(f[j-]);
}
return MST_Kruskal(n,m);
} int main()
{
int t,n,m,k,i,p,q,c,ans;
scanf("%d",&t);
while(t--)
{
scanf("%d%d%d",&n,&m,&k);
for(i=;i<m;++i)
{
scanf("%d%d%d",&p,&q,&c);
p--;q--;
E[i].u=p;E[i].v=q;E[i].w=c;
}
ans=solve(n,m,k);
printf("%d\n",ans);
}
return ;
}
Connect the Cities(hdu3371)并查集(附测试数据)的更多相关文章
- Connect the Cities[HDU3371]
Connect the Cities Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)T ...
- [hdu2874]Connections between cities(LCA+并查集)
题意:n棵树,求任意两点的最短距离. 解题关键:并查集判断两点是否位于一棵树上,然后求最短距离即可.此题可以直接对全部区间直接进行st表,因为first数组会将连接的两点的区间表示出来. //#pra ...
- HDU 3371 Connect the Cities(并查集+Kruskal)
题目网址:http://acm.hdu.edu.cn/showproblem.php?pid=3371 思路: 这道题很明显是一道最小生成树的题目,有点意思的是,它事先已经让几个点联通了.正是因为它先 ...
- PAT 1013 Battle Over Cities(并查集)
1013. Battle Over Cities (25) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue It ...
- TOJ 2815 Connect them (kruskal+并查集)
描述 You have n computers numbered from 1 to n and you want to connect them to make a small local area ...
- hdu 2874 Connections between cities (并查集+LCA)
Connections between cities Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (J ...
- 九度OJ 1325:Battle Over Cities(城市间的战争) (并查集)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:376 解决:132 题目描述: It is vitally important to have all the cities connect ...
- hdu-2874 Connections between cities(lca+tarjan+并查集)
题目链接: Connections between cities Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/327 ...
- 1013 Battle Over Cities (25分) DFS | 并查集
1013 Battle Over Cities (25分) It is vitally important to have all the cities connected by highways ...
随机推荐
- 背水一战 Windows 10 (48) - 控件(集合类): FlipView
[源码下载] 背水一战 Windows 10 (48) - 控件(集合类): FlipView 作者:webabcd 介绍背水一战 Windows 10 之 控件(集合类) FlipView 示例Fl ...
- 【转】ABP webapi三种方式
作者:圣杰 链接:https://www.jianshu.com/p/d14733432dc2 來源:简书 著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 1. 引言 上一节我们 ...
- [LNOI2014]LCA(树剖+线段树)
\(\%\%\% Fading\) 此题是他第一道黑题(我的第一道黑题是蒲公英) 一直不敢开,后来发现是差分一下,将询问离线,树剖+线段树维护即可 \(Code\ Below:\) #include ...
- Django(视图 CBV、FBV)
day67 参考:http://www.cnblogs.com/liwenzhou/articles/8305104.html CBV和FBV 我们之前写过的都是基于函数的view,就叫FBV.还可以 ...
- webstorm “Unterminated statement”
使用webstorm的时候,写console.log,或者一些其他语句的时候 偶尔会出现这种提示,不是报错,就是看着别扭,应该是写法规范问题. 解决办法: 在下面空一行就行了
- VS2013 生成事件,删除不必要的DLL
解决方案中有一个 Project 是 Windows Service,用来从消息队列中取出事件,发送通知电邮: UI是一个MVC网站,两个Project都引用了同一个类库,这个类库引用了第三方的生成P ...
- CGI + FastCGI(PHP-FPM)联系与区别 【图解 + 注释】
〇.背景 参考了几篇文章,总结成 图解 + 注释 方便以后查阅. 参考资料: 1.https://www.zhihu.com/question/19582041 2.https://segmentfa ...
- spring cloud 学习(6) - zuul 微服务网关
微服务架构体系中,通常一个业务系统会有很多的微服务,比如:OrderService.ProductService.UserService...,为了让调用更简单,一般会在这些服务前端再封装一层,类似下 ...
- Linux - 针对用户账号的常用操作
用户目录 除root用户外,其他默认的用户目录一般为/home/<user name>. 可以通过如下步骤修改默认用户目录 修改/etc/passwd文件中相应用户的路径信息 停止此用户的 ...
- Java按时间梯度实现异步回调接口
1. 背景 在业务处理完之后,需要调用其他系统的接口,将相应的处理结果通知给对方,若是同步请求,假如调用的系统出现异常或是宕机等事件,会导致自身业务受到影响,事务会一直阻塞,数据库连接不够用等异常现象 ...