题意: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的更多相关文章

  1. LightOj 1123-Trail Maintenance(最小生成树:神级删边)

    1123 - Trail Maintenance PDF (English) Statistics Forum Time Limit: 2 second(s) Memory Limit: 32 MB ...

  2. lightoj.1048.Conquering Keokradong(二分 + 贪心)

    Conquering Keokradong Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%lld & %llu ...

  3. LightOJ 1138 Trailing Zeroes (III)(二分 + 思维)

    http://lightoj.com/volume_showproblem.php?problem=1138 Trailing Zeroes (III) Time Limit:2000MS     M ...

  4. 区间DP LightOJ 1422 Halloween Costumes

    http://lightoj.com/volume_showproblem.php?problem=1422 做的第一道区间DP的题目,试水. 参考解题报告: http://www.cnblogs.c ...

  5. LightOj 1298 - One Theorem, One Year(DP + 欧拉)

    题目链接:http://lightoj.com/volume_showproblem.php?problem=1298 题意:给你两个数 n, p,表示一个数是由前 k 个素数组成的,共有 n 个素数 ...

  6. 修改目的端trail文件的最大大小--转载

    本文为原创,转载请注明出处: http://blog.csdn.net/msdnchina/article/details/38346435 修改目的端trail文件的最大大小. 本文产生的背景: 在 ...

  7. 1214 - Large Division -- LightOj(大数取余)

    http://lightoj.com/volume_showproblem.php?problem=1214 这就是一道简单的大数取余. 还想还用到了同余定理: 所谓的同余,顾名思义,就是许多的数被一 ...

  8. LightOJ Beginners Problems 部分题解

    相关代码请戳 https://coding.net/u/tiny656/p/LightOJ/git 1006 Hex-a-bonacci. 用数组模拟记录结果,注意取模 1008 Fibsieve's ...

  9. 第24/24周 数据库维护(Database Maintenance)

    哇哦,光阴似箭!欢迎回到性能调优培训的最后一期.今天我会详细讲下SQL Server里的数据库维护,尤其是索引维护操作,还有如何进行数据库维护. 索引维护 作为一个DBA,数据库维护是你工作中非常重要 ...

随机推荐

  1. tinkcmf视频上传大小限制

    /application/Common/Common/function.php 找到upload_max_filesize把后面的数值改成合适的大小(单位是KB)

  2. 数组的方法之(Array.prototype.filter() 方法)

    filter() 方法创建一个新的数组,新数组中的元素是通过检查指定数组中符合条件的所有元素.     注意: filter() 不会对空数组进行检测.     注意: filter() 不会改变原始 ...

  3. golang数组 排序和查找

    package main import "fmt" func BubbleSort(arr *[5]int){ fmt.Println("排序前arr=",(* ...

  4. 使用DIV+CSS布局网站的优点和缺陷

    随着WEB2.0标准化设计理念的普及,国内很多大型门户网站已经纷纷采用DIV+CSS制作方法,从实际应用情况来看,此种方法绝对好于表格制作页面的方法. 如今大部分网站仍然采用表格嵌套内容的方式来制作网 ...

  5. 用gradle4.4转化spring,发现依赖包integration-0.9.15.jar已经不在

    用gradle4.4转化spring,发现依赖包integration-0.9.15.jar已经不在仓库了,应该怎么解决? 解决办法如下: 1  修改build.gradle文件,将id " ...

  6. Python学习笔记(三)Python基本数字类型及其简单操作(1)

    一.数字类型 表示数字或数值的数据类型称为数字类型,Python语言提供3种数字类型:整数.浮点数和复数,分别对应数学中的整数.实数和复数,下面就一起来了解一下他们吧! 1.整数类型 整数类型与数学中 ...

  7. VLSM(可变长子网掩码)

    http://blog.sina.com.cn/s/blog_635e1a9e0100yk51.html(转载) VLSM的介绍: VLSM(VLSM(Variable Length Subnetwo ...

  8. MUI - 封装localStorage与plus.storage

    MUI - 封装localStorage与plus.storage 2.0版本 在使用plus.storage频繁地存取数据时,可以感觉到明显的卡顿,而且很耗内存, 在切换到localstorage时 ...

  9. BasicAuth memo

    string authInfo = userName + ":" + userPassword; authInfo = Convert.ToBase64String(Encodin ...

  10. cocos2dx 2.2.3在Windows 7 64bit上搭建开发环境

    最终弄完了cocos2dx 2.2.3在windows 7 64bit上的环境搭建,过程比較揪心.揪心的主要原因还是引擎的开发人员和官方文档的写作者都是偏爱MAC OS的,所以官方文档中的安装方法是以 ...