LightOJ 1123 Trail Maintenance
题意:n个城市m天、每一天修一条道路,输出当前天数的最小生成树,但是这里有一个条件,就是说最小生成树必须包括全部n个城市,否则输出-1
思路:边数有6000如果每一天跑一次最小生成树的话就接近O(m^2logm)再加上数据量、是很可能会超时的、这时我们就得想想能不能删去一些边、这样在求最小生成树的时候就可以减少很多不必要的边,因为只有n(<=200)个城市,最多只会有n-1条边,那么哪种情况下的边可以删去呢?
#include<cmath>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int qq=;
int pre[];
struct Edge
{
int u,v,w;
bool operator < (const Edge a)const{
return w<a.w;
}
}edge[qq];
int cnt;
int find(int x)
{
if(x==pre[x]) return x;
return pre[x]=find(pre[x]);
}
int kruscal(int n)
{
for(int i=;i<=n;++i)
pre[i]=i;
int u,v,w;
int minx=,count=;
int ans=cnt; //先记录当前所有的边数、
for(int i=;i<ans;++i){ //遍历所有的边、
u=edge[i].u;v=edge[i].v;w=edge[i].w;
int x=find(u);
int y=find(v);
if(x==y){ //这种情况下是一定会删边的、
edge[i]=edge[cnt-];
--cnt; //因为开始已经将当前边数数值给ans了,所以不用担心遍历不到当前的所有边
continue; // 可以直接进行删边操作了、
}
++count; //记录当前的边数、
pre[y]=x;
minx+=w;
}
if(count==n) return minx; //因为是开始count的初值是1,所以只需要判断当前边数等于n与否
else return -;
}
int main()
{
int t;scanf("%d",&t);
int k=;
while(t--){
int n,m;
scanf("%d%d",&n,&m);
int u,v,w;
cnt=;
printf("Case %d:\n",k++);
for(int i=;i<m;++i){
scanf("%d%d%d",&u,&v,&w);
edge[cnt].u=u;edge[cnt].v=v;edge[cnt++].w=w;
sort(edge,edge+cnt);
printf("%d\n",kruscal(n));
}
}
return ;
}
在结构体内重载运算符的时候记得加return 记得加return 记得加return
重要事情说三遍、!!!
LightOJ 1123 Trail Maintenance的更多相关文章
- LightOj 1123-Trail Maintenance(最小生成树:神级删边)
1123 - Trail Maintenance PDF (English) Statistics Forum Time Limit: 2 second(s) Memory Limit: 32 MB ...
- lightoj.1048.Conquering Keokradong(二分 + 贪心)
Conquering Keokradong Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%lld & %llu ...
- LightOJ 1138 Trailing Zeroes (III)(二分 + 思维)
http://lightoj.com/volume_showproblem.php?problem=1138 Trailing Zeroes (III) Time Limit:2000MS M ...
- 区间DP LightOJ 1422 Halloween Costumes
http://lightoj.com/volume_showproblem.php?problem=1422 做的第一道区间DP的题目,试水. 参考解题报告: http://www.cnblogs.c ...
- LightOj 1298 - One Theorem, One Year(DP + 欧拉)
题目链接:http://lightoj.com/volume_showproblem.php?problem=1298 题意:给你两个数 n, p,表示一个数是由前 k 个素数组成的,共有 n 个素数 ...
- 修改目的端trail文件的最大大小--转载
本文为原创,转载请注明出处: http://blog.csdn.net/msdnchina/article/details/38346435 修改目的端trail文件的最大大小. 本文产生的背景: 在 ...
- 1214 - Large Division -- LightOj(大数取余)
http://lightoj.com/volume_showproblem.php?problem=1214 这就是一道简单的大数取余. 还想还用到了同余定理: 所谓的同余,顾名思义,就是许多的数被一 ...
- LightOJ Beginners Problems 部分题解
相关代码请戳 https://coding.net/u/tiny656/p/LightOJ/git 1006 Hex-a-bonacci. 用数组模拟记录结果,注意取模 1008 Fibsieve's ...
- 第24/24周 数据库维护(Database Maintenance)
哇哦,光阴似箭!欢迎回到性能调优培训的最后一期.今天我会详细讲下SQL Server里的数据库维护,尤其是索引维护操作,还有如何进行数据库维护. 索引维护 作为一个DBA,数据库维护是你工作中非常重要 ...
随机推荐
- BZOJ2069: [POI2004]ZAW
2069: [POI2004]ZAW Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 303 Solved: 138[Submit][Status][D ...
- 【模板】矩阵快速幂 洛谷P2233 [HNOI2002]公交车路线
P2233 [HNOI2002]公交车路线 题目背景 在长沙城新建的环城公路上一共有8个公交站,分别为A.B.C.D.E.F.G.H.公共汽车只能够在相邻的两个公交站之间运行,因此你从某一个公交站到另 ...
- javascript之键盘事件的方法
键盘事件包含onkeydown.onkeypress和onkeyup这三个事件 事件初始化 function keyDown(){} document.onkeydown = keyDown; //论 ...
- Django用户名密码错误提示
from django.shortcuts import render # Create your views here. from django.shortcuts import render fr ...
- arcgis信息窗口
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- 洛谷 P1420 最长连号【最长合法子序列/断则归一】
题目描述 输入n个正整数,(1<=n<=10000),要求输出最长的连号的长度.(连号指从小到大连续自然数) 输入输出格式 输入格式: 第一行,一个数n; 第二行,n个正整数,之间用空格隔 ...
- python的数据类型和变量
数据类型 计算机顾名思义就是可以做数学计算的机器,因此,计算机程序理所当然地可以处理各种数值.但是,计算机能处理的远不止数值,还可以处理文本.图形.音频.视频.网页等各种各样的数据,不同的数据,需要定 ...
- 使用pip出现 cannot import name "main"
最近在linux使用pip install时遇到了这个报错 1.jpg ImportError: cannot import name main 遇到这个问题,我的解决办法是:cd 到usr/bin目 ...
- 【JZOJ1611】Dining
题目描述 农夫JOHN为牛们做了很好的食品,但是牛吃饭很挑食.每一头牛只喜欢吃一些食品和饮料而别的一概不吃.虽然他不一定能把所有牛喂饱,他还是想让尽可能多的牛吃到他们喜欢的食品和饮料. 农夫JOHN做 ...
- poj 2229 【完全背包dp】【递推dp】
poj 2229 Sumsets Time Limit: 2000MS Memory Limit: 200000K Total Submissions: 21281 Accepted: 828 ...