1123 - Trail Maintenance

Time Limit: 2 second(s) Memory Limit: 32 MB

Tigers in the Sunderbans wish to travel freely among the N fields (numbered from 1 to N), even though they are separated by trees. The tigers wish to maintain trails between pairs of fields so that they
can travel from any field to any other field using the maintained trails. Tigers may travel along a maintained trail in either direction.

The tigers do not build trails. Instead, they maintain deer trails that they have discovered. On any week, they can choose to maintain any or all of the deer animal trails they know about. Always curious, the tigers discover one new deer trail at the beginning
of each week. They must then decide the set of trails to maintain for that week so that they can travel from any field to any other field. Tigers can only use trails which they are currently maintaining.

The tigers always want to minimize the total length of trail they must maintain. The tigers can choose to maintain any subset of the deer trails they know about, regardless of which trails were maintained the previous week. Deer trails (even when maintained)
are never straight. Two trails that connect the same two fields might have different lengths. While two trails might cross, tigers are so focused; they refuse to switch trails except when they are in a field. At the beginning of each week, the tigers will
describe the deer trail they discovered. Your program must then output the minimum total length of trail the tigers must maintain that week so that they can travel from any field to any other field, if there is such a set of trails.

Input

Input starts with an integer T (≤ 25), denoting the number of test cases.

Each case starts with two integers N (1 ≤ N ≤ 200) and WW is the number of weeks the program will cover (1 ≤ W ≤ 6000).

Each of the next W lines will contain three integers describing the trail the tigers found that week. The first two numbers denote the end points (filed numbers) and the third number denotes the length of the trail (1 to 10000).
No trail has the same field as both of its end points.

Output

For each case, print the case number in a line. Then for every week, output a single line with the minimum total length of trail the tigers must maintain so that they can travel from any field to any other field. If no set of trails allows the tigers to
travel from any field to any other field, output "-1".

Sample Input

Output for Sample Input

1

4 6

1 2 10

1 3 8

3 2 3

1 4 3

1 3 6

2 1 2

Case 1:

-1

-1

-1

14

12

8


题意:给n个点,m条边。对于每输入一条边。求此时(包含前面输入的边)的最小生成树,好吧,我承认这题实在是太猛了。一開始我直接套Krustra。直接TLE,后来參考某大牛。原来我直接上的O(n*m)的复杂度,后来一想是这种。对于每输入一条边,以此时的边的总数作为总数来求生成树,而且,在合并的过程中要有一个删边的优化,即假设遇到一条和之前选到MST中的边之中的一个 在同一个集合里(即有环) 那么要删除这条边,(非常好理解由于之前已经挑选到了最合适的边了,所以这条边就不须要了。即2选1 仅仅能选最优,否则就会形成环) 
#include <cstdio>
#include <iostream>
#include <cstring>
#include <cctype>
#include <cstdlib>
#include <algorithm>
#include <vector>
#include <queue>
#include <stack>
#include <set>
#include <map>
#include <list>
using namespace std;
const int maxn=5000;
const int INF=1<<25;
int n,m,u[maxn],v[maxn],w[maxn],eg[maxn],fa[maxn];
void Make_set()
{
for(int i=0;i<=n;i++)
fa[i]=i;
}
int Find(int x)
{
if(x==fa[x]) return x;
return fa[x]=Find(fa[x]);
}
bool cmp(int a,int b)
{
return w[a]<w[b];
}
int num;
int Kru()
{
int d=-1,i,ans=0,cnt=0;
Make_set();
for(i=0;i<num;i++)
eg[i]=i;
sort(eg,eg+num,cmp);
for(i=0;i<num;i++)
{
int e=eg[i];
int fx=Find(u[e]);
int fy=Find(v[e]);
if(fx==fy)
{
d=e;
continue;
}
fa[fx]=fy;
ans+=w[e];
cnt++;
}
if(d!=-1)//删边
{
num--;
u[d]=u[num];
v[d]=v[num];
w[d]=w[num];
}
if(cnt==n-1)
return ans;
else
return -1;
}
int main()
{
int T,cas=1;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&m);
printf("Case %d:\n",cas++);
num=0;//边数
for(int i=0;i<m;i++)
{
scanf("%d%d%d",&u[num],&v[num],&w[num]);
num++;
printf("%d\n",Kru());
}
}
return 0;
}

用结构体写了一下。还有要注意就是这题特别卡cin cout

#include <cstdio>
#include <iostream>
#include <cstring>
#include <cctype>
#include <cstdlib>
#include <algorithm>
#include <vector>
#include <queue>
#include <stack>
#include <set>
#include <map>
#include <list>
using namespace std;
const int maxn=500001;
const int INF=1<<29;
struct node{
int u,v,w;
friend bool operator<(node a,node b){
return a.w<b.w;
}
};
node eg[maxn];
int n,m,fa[maxn];
void Make_set()
{
for(int i=1;i<=n;i++)
fa[i]=i;
}
int Find(int x)
{
if(x!=fa[x])
fa[x]=Find(fa[x]);
return fa[x];
}
int num;
int Kru()
{
Make_set();
sort(eg,eg+num);
int ans=0,cnt=0,d=-1;
for(int i=0;i<num;i++)
{
int fx=Find(eg[i].u);
int fy=Find(eg[i].v);
if(fx==fy)
{
d=i;
continue;
}
else
{
fa[fx]=fy;
ans+=eg[i].w;
cnt++;
}
}
if(d!=-1) eg[d]=eg[--num];
if(cnt==n-1) return ans;
return -1;
}
int main()
{
int T,cas=1;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&m);
printf("Case %d:\n",cas++);
num=0;
for(int i=0;i<m;i++)
{
scanf("%d%d%d",&eg[num].u,&eg[num].v,&eg[num].w);
num++;
printf("%d\n",Kru());
}
}
return 0;
}

LightOj 1123-Trail Maintenance(最小生成树:神级删边)的更多相关文章

  1. LightOJ 1123 Trail Maintenance

    题意:n个城市m天.每一天修一条道路,输出当前天数的最小生成树,但是这里有一个条件,就是说最小生成树必须包括全部n个城市,否则输出-1 思路:边数有6000如果每一天跑一次最小生成树的话就接近O(m^ ...

  2. VIM自动补全插件 - YouCompleteMe--"大神级vim补全插件"

    VIM自动补全插件 - YouCompleteMe 序言 vim 之所以被称为编辑器之神多半归功于其丰富的可DIY的灵活插件功能,( 例如vim下的这款神级般的代码补全插件YouCompleteMe) ...

  3. Github欢乐多 PHP神级代码引发吐槽热

    前日,github的PHP板块惊现一段能够提升70%运行效率的代码,引发了全世界众多网友的吐槽和调侃,“awesome!”.“well done!”.“PHP是世界第一语言!”平时不苟言笑,埋头苦干的 ...

  4. 用了TextMate才知道什么叫神级Editor

    用了TextMate才知道什么叫神级Editor 一直用Eclipse作为开发Ruby和Java项目的IDE,但是太耗内存,再开个Firefox和虚拟机就可以直接将MBP弄残了..看到大家都对Mac下 ...

  5. 20171201 - macOS High Sierra 神级 bug

    昨日亲测有效,macOS High Sierra 神级 bug,系统管理员 root 密码为空,输入就可以登录,具备最高权限. 让人不禁想象 Apple Software 怎么了,人才都流失了吗?

  6. 《程序员代码面试指南》第三章 二叉树问题 遍历二叉树的神级方法 morris

    题目 遍历二叉树的神级方法 morris java代码 package com.lizhouwei.chapter3; /** * @Description:遍历二叉树的神级方法 morris * @ ...

  7. 大神级回答exists与in的区别

    google搜了一下,很多帖子,而且出发点不同,各有各的道理,但是有一个帖子讲的特别好: http://zhidao.baidu.com/question/134174568.html 忍不住在百度上 ...

  8. IntelliJ IDEA 15款 神级超级牛逼插件推荐(超赞,谁用谁知道)

    满满的都是干货  所有插件都是在 ctrl+alt+s 里的plugins 里进行搜索安装 1.CodeGlance 代码迷你缩放图插件 2. Codota 代码提示工具,扫描你的代码后,根据你的敲击 ...

  9. mac上的键盘生活——神级输入法:鼠须管

    好吧,我是今天才知道这个无敌的输入法有多么强悍,传说中的神级输入法,鼠须管~ 在这之前我都一直是用的搜狗输入法,因为以前在win下就一直都用的是搜狗输入法,怎么说,各种国产的输入法做的还是比较有良心的 ...

随机推荐

  1. Linux线程 之 线程 线程组 进程 轻量级进程(LWP) -systemtap -mysql

    http://blog.chinaunix.net/uid-24774106-id-3650136.html http://blog.itpub.net/15480802/viewspace-7627 ...

  2. 使用DataGridView进行增删改查,并同步到数据库

    DataGridView控件具有极高的可配置性和可扩展性.它提供有大量的属性.方法和事件,能够用来对该控件的外观和行为进行自己定义.以下通过一个小样例来展示DataGridView进行增删改查,并同步 ...

  3. leetcode第一刷_Gray Code

    说到格雷码,应该没人不知道,详细它有什么用,我还真不是非常清楚,我室友应该是专家.生成的规律不是非常明显,之前看到帖子讲的,这会儿找找不到了.. 思想是这种,假设有n位,在第2^(n-1)个编码以下画 ...

  4. jsp中生成txt文件

    import jxl.Workbook; import jxl.write.Label; import jxl.write.WritableSheet; import jxl.write.Writab ...

  5. 采用Operator-sdk轻松将helm chart转为Operator

    去年就接触Operator,从Oracle发布的WebLogic Operator到mySQL Operator,构建的源码一大堆,但感觉一直缺少合适的开发框架能够避免复杂性快速生成, 随着技术的日益 ...

  6. 学习笔记:STL

    第一部分:(参考百度百科) 一.STL简介 STL(Standard Template Library,标准模板库)是惠普实验室开发的一系列软件的统称.它是由Alexander Stepanov.Me ...

  7. 【BZOJ】【3668】【NOI2014】起床困难综合症

    贪心 位运算的题……基本都是按位来做的?... 从高位到低位,贪心来搞就可以了…… 这都算不上是数位DP吧= = /****************************************** ...

  8. Spark源码分析

    名词解释 RDD全称为ResilientDistributedDataset,弹性分布式数据集.就是分布在集群节点上的数据集,这些集合可以用来进行各种操作.最重要的一点是,某个操作计算后的数据集可以缓 ...

  9. [leetcode]Populating Next Right Pointers in Each Node II @ Python

    原题地址:https://oj.leetcode.com/problems/populating-next-right-pointers-in-each-node-ii/ 题意: Follow up ...

  10. Objective-C-Category类别

    Object-C开发的时候有的时候会用到Category类,类似于Java和C#中扩展类,就是如果你觉得如果你觉得常用的方法在String中没有,可以根据业务需求和个人喜好写一个扩展类,然后在其中补充 ...