HDU 3080 The plan of city rebuild(prim和kruskal)
The plan of city rebuild
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 616 Accepted Submission(s): 215
officers have to make a new plan, now you , as the designer, have the task to judge if the plan is practical, which means there are roads(direct or indirect) between every two villages(of course the village has not be destroyed), if the plan is available,
please output the minimum cost, or output"what a pity!".
Each case contains three parts. The first part contains two integers l(0<l<100), e1, representing the original number of villages and roads between villages(the range of village is from 0 to l-1), then follows e1 lines, each line contains three integers a,
b, c (0<=a, b<l, 0<=c<=1000), a, b indicating the village numbers and c indicating the road cost of village a and village b . The second part first contains an integer n(0<n<100), e2, representing the number of new villages and roads(the range of village is
from l to l+n-1), then follows e2 lines, each line contains three integers x, y, z (0<=x, y<l+n, 0<=z<=1000), x, y indicating the village numbers and z indicating the road cost of village x and village y. The third part contains an integer m(0<m<l+n), representing
the number of deserted villages, next line comes m integers, p1,p2,…,pm,(0<=p1,p2,…,pm<l+n) indicating the village number.
Pay attention: if one village is deserted, the roads connected are deserted, too.
2
4 5
0 1 10
0 2 20
2 3 40
1 3 10
1 2 70
1 1
4 1 60
2
2 3
3 3
0 1 20
2 1 40
2 0 70
2 3
0 3 10
1 4 90
2 4 100
0
70
160
反正光看题目就花了半小时。真不明确了,老路,新路,给边还分两次给。。
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int INF =1e8;
int mp[205][205];
int des[205];
int visi[205];
int low[205]; //更新最小值
int n; int prim()
{
int i,j; memset(visi,0,sizeof(visi));
for(i=0;i<=200;i++)
low[i]=INF;
int ans=0,pos=-1;
for(i=0;i<n;i++)
{
if(!des[i])
{
pos=i;
break;
}
} if(pos==-1) return 0; for(i=0;i<=200;i++)
low[i]=mp[pos][i]; visi[pos]=1;
int mi;
for(i=0;i<n;i++)
{
mi=INF;
int flag=0;
for(j=0;j<n;j++)
{
if(des[j]) continue;
if(!visi[j])
{
flag=1;
if(low[j]<mi)
{
mi=low[j];
pos=j;
}
}
} if(mi==INF&&flag)
return -1;
if(!flag) return ans;
ans+=mi;
visi[pos]=1;
for(j=0;j<n;j++)
if(!visi[j])
low[j]=min(low[j],mp[pos][j]);
}
return ans;
} int main()
{
int tes,i,j,res;
scanf("%d",&tes); while(tes--)
{
int n1,m,u,v,val;
scanf("%d%d",&n1,&m); for(i=0;i<=200;i++)
for(j=0;j<=200;j++)
mp[i][j]=INF;
memset(des,0,sizeof(des));
for(i=0;i<m;i++)
{
scanf("%d%d%d",&u,&v,&val);
if(mp[u][v]>val) //这个地方。边可能会多次给出,坑。。
{
mp[u][v]=val;
mp[v][u]=val;
}
}
int n2;
scanf("%d%d",&n2,&m);
for(i=0;i<m;i++)
{
scanf("%d%d%d",&u,&v,&val);
if(mp[u][v]>val)
{
mp[u][v]=val;
mp[v][u]=val;
}
}
n=n1+n2;
int t,x;
scanf("%d",&t);
for(i=0;i<t;i++)
{
scanf("%d",&x);
des[x]=1;
} res=prim();
if(res==-1) puts("what a pity!");
else printf("%d\n",res);
}
return 0;
}
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int INF =1e6;
const int maxn=205; int n,m,t; //总点数,总边数,desert的边数 int des[maxn]; //为1代表城市荒废
int fa[maxn]; struct Edge
{
int from;
int to;
int val;
}edge[maxn*maxn]; int cmp(Edge p1,Edge p2)
{
//if(des[p1.from]||des[p1.to]) return 0;
//if(des[p2.from]||des[p2.to]) return 1;
return p1.val<p2.val;
} void init()
{
for(int i=0;i<=200;i++)
fa[i]=i;
} int find1(int x)
{
if(fa[x]!=x) fa[x]=find1(fa[x]);
return fa[x];
} void merge1(int p1,int p2)
{
p1=find1(p1);
p2=find1(p2);
fa[p1]=p2;
} int Kruskal()
{
sort(edge,edge+m,cmp);
int ans=0,ste=0; for(int i=0;i<m&&ste<n-t-1;i++)
{
int u=edge[i].from,v=edge[i].to,val=edge[i].val;
if(des[u]||des[v]) continue;
if(find1(u)!=find1(v))
{
ste++;
ans+=val;
merge1(u,v);
}
} if(ste==n-t-1) return ans;
return -1;
} int main()
{
int tes,i,j,res;
scanf("%d",&tes); while(tes--)
{
int n1,m1,u,v,val,n2,m2;
scanf("%d%d",&n1,&m1); memset(des,0,sizeof(des)); for(i=0;i<m1;i++)
{
scanf("%d%d%d",&u,&v,&val);
edge[i].from=u;
edge[i].to=v;
edge[i].val=val;
} scanf("%d%d",&n2,&m2);
n=n1+n2;
m=m1+m2; for(i=m1;i<m;i++)
{
scanf("%d%d%d",&u,&v,&val);
edge[i].from=u;
edge[i].to=v;
edge[i].val=val;
} int x;
scanf("%d",&t);
for(i=0;i<t;i++)
{
scanf("%d",&x);
des[x]=1;
} init();
res=Kruskal(); //cout<<n<<" :n"<<endl;
if(res==-1) puts("what a pity!");
else printf("%d\n",res);
}
return 0;
}
HDU 3080 The plan of city rebuild(prim和kruskal)的更多相关文章
- HDU 3080 The plan of city rebuild(除点最小生成树)
题意 一个城市原来有l个村庄 e1条道路 又添加了n个村庄 e2条道路 后来后销毁了m个村庄 与m相连的道路也销毁了 求使全部未销毁村庄相互连通最小花费 不能连通输出what a pity ...
- hdu 1233 还是畅通工程 最小生成树(prim算法 + kruskal算法)
还是畅通工程 Time Limit: 4000/2 ...
- Prim和Kruskal最小生成树
标题: Prim和Kruskal最小生成树时 限: 2000 ms内存限制: 15000 K总时限: 3000 ms描述: 给出一个矩阵,要求以矩阵方式单步输出生成过程.要求先输出Prim生成过程,再 ...
- 【图论】信手拈来的Prim,Kruskal和Dijkstra
关于三个简单的图论算法 prim,dijkstra和kruskal三个图论的算法,初学者容易将他们搞混,所以放在一起了. prim和kruskal是最小生成树(MST)的算法,dijkstra是单源最 ...
- 图的最小生成树的理解和实现:Prim和Kruskal算法
最小生成树 一个连通图的生成树是一个极小的连通子图,它含有图中所有的顶点,但只有足以构成一棵树的n-1条边.我们将构造连通网的最小代价生成树称为最小生成树(Minimum Cost Spanning ...
- 最小生成树(prim和kruskal)
最小生成树(prim和kruskal) 最小生成树的最优子结构性质 设一个最小生成树是T.如果选出一个T中的一条边,分裂成的两个树T1,T2依然是它们的点集组成的最小生成树.这可以用反证法来证.反着来 ...
- 最小生成树,Prim和Kruskal的原理与实现
文章首先于微信公众号:小K算法,关注第一时间获取更新信息 1 新农村建设 大清都亡了,我们村还没有通网.为了响应国家的新农村建设的号召,村里也开始了网络工程的建设. 穷乡僻壤,人烟稀少,如何布局网线, ...
- 最小生成树MST算法(Prim、Kruskal)
最小生成树MST(Minimum Spanning Tree) (1)概念 一个有 n 个结点的连通图的生成树是原图的极小连通子图,且包含原图中的所有 n 个结点,并且有保持图连通的最少的边,所谓一个 ...
- 2015 Multi-University Training Contest 1 hdu 5290 Bombing plan
Bombing plan Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)To ...
随机推荐
- python⽤户登陆
⽤户登陆(三次输错机会)且每次输错误时显示剩余错误次数(提示:使⽤字符串格式化) count = 3 while count < 4: count -= 1 username = input(' ...
- 小程序08 小程序访问服务器API
后台交互 小程序是前端框架,需要和后台交互,本次课程主要介绍网络API. 小程序提供的网络访问API wx.request接口 发起 HTTPS 网络请求. 使用rqeust接口前的工作 1.小程序需 ...
- 日常[系统]:Linux新人报到(吐槽%&%……&¥……%
昨天换了系统,从win7换到了NOIP必须面对的Linux系统. 不得不说,真的很不适应.原本右上角的三个按钮变到了左上角. 可爱的DEVCPP被无情的抛弃了. 又用不惯guide,只好用文本编辑器写 ...
- 报错:org.springframework.dao.InvalidDataAccessResourceUsageException: could not execute statement; SQL [n/a]; nested exception is org.hibernate.exception.SQLGrammarException: could not execute statement
org.springframework.dao.InvalidDataAccessResourceUsageException: could not execute statement; SQL [n ...
- 169. Majority Element@python
Given an array of size n, find the majority element. The majority element is the element that appear ...
- python 学习总结2
温度转换问题 一.温度转换 目前有两种表示温度的方法一种是摄氏度另一种是华氏度,摄氏度的结冰点为0度,沸点为100度将温度等分刻画,华氏度的结冰点为32度,沸点为212度将温度进行等刻度划分. 现需要 ...
- Java多线程入门Ⅱ
线程的让步 线程让出自己占用的CPU资源 线程让出资源,不指定让给谁 线程让出资源,指定让给谁 方法1: public static void yield(); 线程实现交替打印 import jav ...
- centos挂载本地镜像作为yum源
1.安装Centos后默认的Yum源如下 ll /etc/yum.repos.d/ [root@localhost ~]# ll /etc/yum.repos.d/ total 32 -rw-r- ...
- MySQL语句之or和and多条件查询
在where中可以包含任意数目的and和or操作符,需要注意的是在没有任何其他符号的时候,例如括号,AND的优先级高于OR,因此,当两者一起使用时,先运算AND两边的条件表达式,再运算OR两边的条件表 ...
- [Vijos1067]Warcraft III 守望者的烦恼(DP + 矩阵优化)
传送门 可知 f[i] = f[i - 1] + f[i - 2] + ... + f[i - k] 直接矩阵优化就好了 #include <cstdio> #include <cs ...