LightOJ 1029 【最小生成树】
2024-08-29 12:16:40
思路:
利用克鲁斯卡尔算法,最小生成树把边从小到大排序,然后Union;
最大生成树就是把边从大到小排序,然后Union;
#include<bits/stdc++.h>
using namespace std;
typedef __int64 LL; const int N=15000;
struct asd{
int u,v;
int w;
};
asd q[N];
int pre[N],n,num; bool cmp(asd x,asd y)
{
return x.w<y.w;
} void init()
{
for(int i=0;i<=n;i++)
pre[i]=i;
} int Find(int x)
{
int r=x;
while(pre[r]!=r)
r=pre[r];
int i=x,j;
while(pre[i]!=r)
{
j=pre[i];
pre[i]=j;
i=j;
}
return r;
} int max_tree()
{
int ans=0;
init();
for(int i=num-1;i>=0;i--)
{
int aa=Find(q[i].u);
int bb=Find(q[i].v);
if(aa!=bb)
{
pre[aa]=bb;
ans+=q[i].w;
}
}
return ans;
} int min_tree()
{
int ans=0;
init();
for(int i=0;i<num;i++)
{
int aa=Find(q[i].u);
int bb=Find(q[i].v);
if(aa!=bb)
{
pre[aa]=bb;
ans+=q[i].w;
}
}
return ans;
} int main()
{
int T,cas=1;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
num=0;
int a,b,c;
while(scanf("%d%d%d",&a,&b,&c))
{
if(!a&&!b&&!c) break;
q[num].u=a;
q[num].v=b;
q[num].w=c;
num++;
}
sort(q,q+num,cmp);
int q,p;
q=max_tree()+min_tree();
if(q%2)
printf("Case %d: %d/2\n",cas++,q);
else
printf("Case %d: %d\n",cas++,q/2);
}
return 0;
}
最新文章
- Reverse Linked List | &; ||
- PhoneGap,Cordova[3.5.0-0.2.6]:利用插件Cordova-SQLitePlugin来操作SQLite数据库
- Android实例-全屏显示程序(XE10+小米2)(无图)
- 解决ie8不兼容jquery trim问题
- CodeViz产生函数调用图
- HDUJ 1754 I Hate It
- java特权制度设计篇
- Arch安装KDE5
- Mysql--单表数据记录查询
- 基于Three.js的360度全景--photo-sphere-viewer--简介
- sed 修改文本
- 有关 Azure 机器学习的 Net# 神经网络规范语言的指南
- .net core 下编码问题
- Control4系统对接arduino
- bat 复制文件夹,文件名递增 等操作
- ABP框架系列之五十:(Swagger-UI-集成)
- 排序基础之非比较的计数排序、桶排序、基数排序(Java实现)
- 《EMCAScript6入门》读书笔记——24.编程风格
- golang模拟动态高优先权优先调度算法
- Unity3D-实现连续点击两次返回键退出游戏(安卓/IOS)
热门文章
- 【MatConvNet】配置GPU
- 辛星浅析html5中的role属性
- [省选]板块(shenben已经AFO!!!)
- Delphi类的默认区域
- STL之队列的运用
- 用ASTERISK搭建自己的免费VOIP服务器
- windows定时计划备份MySql
- Android 6.0 如何默认打开user版本的root权限【转】
- Codeforces Round #379 (Div. 2) E. Anton and Tree —— 缩点 + 树上最长路
- BestCoder7 1001 Little Pony and Permutation(hdu 4985) 解题报告