Connect the Cities 【最小生成树】
来源:互联网 发布:淘宝立体服装拍摄姿势 编辑:程序博客网 时间:2024/05/17 02:42
In 2100, since the sea level rise, most of the cities disappear. Though some survived cities are still connected with others, but most of them become disconnected. The government wants to build some roads to connect all of these cities again, but they don’t want to take too much money.
Input
The first line contains the number of test cases.
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
For each case, output the least money you need to take, if it’s impossible, just output -1.
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
题意 n个点m条路,其中有一些点之间已经连接在一起,问最少需要多少钱。
已经链接在一起的点,可以用并查集来搞,然后在跑一个MST
代码
#include<bits/stdc++.h>#define LL long longusing namespace std;const int MAXN = 1e5;const int MAXM = 1e8;const double PI = acos(-1.0);const double e =exp(1.0);/*-------------------------------*/struct Edge { int from,to,val;}edge[MAXN];bool cmp(Edge a,Edge b){ return a.val<b.val;}int par[MAXN];int n,m,k;int Find(int x){return x==par[x]?x:par[x]=Find(par[x]);}void join(int a,int b){ a=Find(a); b=Find(b); if(a!=b) par[a]=b;}void init(){ for(int i=0;i<=n;i++) par[i]=i;}void getmap(){ int a,b,c; for(int i=0;i<m;i++) scanf("%d%d%d",&edge[i].from,&edge[i].to,&edge[i].val); while(k--){ int t;scanf("%d",&t); t--;scanf("%d",&a); while(t--){ scanf("%d",&b); join(a,b); } }}void krus(){ int sum=0; sort(edge,edge+m,cmp); for(int i=0;i<m;i++){ Edge e=edge[i]; if(Find(e.from)!=Find(e.to)) { sum+=e.val; join(e.from,e.to); } } int i,j; for(i=2;i<=n;i++){ if(Find(i)!=Find(1)) break; } if(i==n+1) printf("%d\n",sum); else printf("-1\n");}int main(){ int t;cin>>t; while(t--){ scanf("%d%d%d",&n,&m,&k); init(); getmap(); krus(); } return 0;}
- hdu3371 Connect the Cities (最小生成树)
- HDU_3371 Connect the cities(最小生成树)
- Connect the Cities 【最小生成树】
- HDU3371(Connect the Cities)最小生成树
- hdu 3371 Connect the Cities(最小生成树)
- hdu 3371 Connect the Cities 最小生成树(kruskal算法)
- HDU 3371 Connect the Cities(最小生成树)
- hdu 3371 最小生成树Connect the Cities
- HDU3371 Connect the Cities 【最小生成树Kruskal】
- hdu oj 3371 Connect the Cities (最小生成树)
- HDOJ 题目3371Connect the Cities(最小生成树)
- hdu 3371 Connect the Cities(最小生成树))
- HDU 3371 Connect the Cities 最小生成树
- HDU 3371 Connect the Cities 【最小生成树】
- hdu 3371(Connect the Cities)(最小生成树)
- hdu 3371 Connect the Cities(最小生成树kruskal)
- hdoj-3371-Connect the Cities【最小生成树】
- HDOJ 3371 Connect the Cities(最小生成树--prime 水)
- io流常见实例记录
- HTML 2017.07.19
- MainActivity.java9
- 基于XMPP协议(openfire服务器)的消息推送实现
- 函数定义使用说明递归参数函数指针,李白打酒,程序例子
- Connect the Cities 【最小生成树】
- python 连接数据库
- 深度学习笔记——理论与推导之RNN的训练过程BPTT(五)
- MyApplication.java9
- POJ总结(1035)-Java
- 在Openfire上弄一个简单的推送系统
- java-重写/重载
- POJ 2411 Mondriaan's Dream(插头DP,轮廓线)
- 搭建项目,并与Gitlab构建连接的方法