洛谷1195口袋的天空
来源:互联网 发布:淘宝宝贝视频怎么上传 编辑:程序博客网 时间:2024/05/16 11:40
首先这个题第一眼想到的是最小生成树,但他有k个树,那怎么办那?可以贪心一下。首先建图,将没有任何边得点的个数记录下来(kx),这些点自成一个集合,那么需要再建k-kx个树。
首先建一个最小生成树(共tail个边存入team【】中),那么建k-kx个树需要在最小生成树中拿走k-kx+1个边。因为要取最小花费,所以从最大的边减。
代码如下:
#include<iostream>#include<cstdio>#include<cmath>#include<algorithm>#include<string>#include<queue>using namespace std;int n,m,k,ta,f[100001],team[1000001],tail,kx,sum;int exist[10001];struct re{ int next,w,t,s,head;}e[10001*4];void build(int x,int y,int z){ e[++ta].w=z; e[ta].t=y; e[ta].s=x; e[ta].next=e[x].head; e[x].head=ta;}bool cmp(re a,re b){ return a.w<b.w;}int find(int x){ if(f[x]==x) return x; return f[x]=find(f[x]);}void add(int a,int b){ int ux,uy; ux=find(a); uy=find(b); f[ux]=uy;}int main(){ cin>>n>>m>>k; for(int i=1;i<=m;++i) { int a,b,c; cin>>a>>b>>c; exist[a]=exist[b]=1; build(a,b,c); build(b,a,c); } for(int i=1;i<=n;++i) { f[i]=i; if(exist[i]==0) ++kx; } k-=kx; sort(e+1,e+ta+1,cmp); for(int i=1;i<=ta;++i) { if(find(e[i].s)!=find(e[i].t)) { add(e[i].s,e[i].t); team[++tail]=i; sum+=e[i].w; } } for(int i=tail;i>(tail-k+1);--i) { sum-=e[team[i]].w; } if(n<(kx+k)||(kx+1)>k+kx) cout<<"No Answer"; //如果点少于k或不在最小生成树中的点大于k则不成立。 else cout<<sum; return 0;}
阅读全文
1 0
- 洛谷 1195 口袋的天空
- 洛谷1195口袋的天空
- 洛谷 P1195 口袋的天空
- 洛谷 P1195 口袋的天空
- 洛谷 P1195 口袋的天空
- 洛谷P1195 口袋的天空
- 洛谷 1195 口袋的天空 最小生成树 解题报告
- 口袋的天空(洛谷 P1195)
- 口袋的天空
- vijos 口袋的天空
- NSU-1483-口袋的天空
- vijos 1234 口袋的天空
- Vijos P1234 口袋的天空
- VIJOS P1234 口袋的天空 Accepted
- |Vijos|图论生成树|P1234 口袋的天空
- kruskal算法应用——口袋的天空
- P1195 口袋的天空(并查集+Kruskal)
- 我的口袋MAC
- 使用sql语句导出oracle数据结构信息
- 关于linux中phpstudy安装redis和扩展
- 【R语言学习】R-Studio 快捷键+入门常见操作
- Java中获取键盘输入值的三种方法
- 资源分配图化简法
- 洛谷1195口袋的天空
- Linux cpuidle framework(1)_概述和软件架构
- React弹框、Toast、弹出页面等简单实现方案(百达通)
- 软导作业
- (ssl 2863)石子合并
- uartlite_IP之仿真
- CSDN-markdown编辑器的详细使用方法
- Linux common clock framework(3)_实现逻辑分析
- 无法加载 DLL“dhnetsdk.dll”: 找不到指定的模块----问题处理