最近学校网课跟得紧没时间写知识点,就拿题解凑个数(bushi

而且前两天我打着打着题解电脑就突然死机 幸运的是 我没有保存(微笑)

废话不多说 上题目!

城市攻击
(city)
(256MB,1s)
【问题描述】
出于某些原因,A国将对B国进行攻击。B国有n个城市,有n-1
双向条道路,每条道路连接两个城市,任意两个城市可以通过道路
互相到达,即构成一棵树。由于资金有限,A国只能攻击B国的两个
城市,攻击后这两个城市将会毁灭,与这两个城市连接的道路也随
之消失,A国希望在攻击后能将B国分成尽可能多的连通块,这样有
利于A国的下一步行动,于是他们找到你来完成这个任务。
【输入格式】
输入文件名为city.in
第一行包含一个整数T,表示数据组数。
对于每组数据
第一行包含一个整数n,表示B国城市的数量。
接下来n-1行,每行两个整数x,y,表示有一条道路连接城市x与城市y
【输出格式】
输出文件名为city.out
输出文件包含T个整数,表示对于每组数据,攻击两个城市后最多能
使B国分成多少个连通块
【输入样例】
city.in city.out
2
5
1 2
2 4
3 4
4 5
7
1 2
2 3
1 4
1 5
3 6
3 7
3
5

【数据规模与约定】
对于20%的数据T<=5,1≤n≤100
对于50%的数据T<=5,1≤n≤1000
对于100%的数据T<=10,1≤n≤100000

看到这个题说实话我考试的时候二话不说直接爆搜= =

但后来老师一讲就发现其实有窍门

具体看我的详(la)细(ji)题解:

 //通过画图可以看出我们要通过删除度数最多的城市点来拆分连通块,在枚举过程中发现删除xy会得到d[x]+d[y]-n个连通块
//且两点相连时n为2两点不连时n为1
//max分别列举情况 判断即可
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
using namespace std;
struct node//
{
int y,next;//y代表目标位, next的意义参照day3-例1
}a[];
int first[],len;// first【x】从x出发的第一条边
int d[];//度数
void ins(int x,int y)//边列表
{
a[++len].y=y;
a[len].next=first[x];
first[x]=len;
}
bool is_conected(int x,int y)//判断两点之间有没有联系
{
int k;
for(k=first[x];k;k=a[k].next)
if(a[k].y==y)return ;
return ;
}
int main()
{
freopen("city.in","r",stdin);
freopen("city.out","w",stdout);
int o,n,i,j,k,x,y;
scanf("%d",&o);//数据组数
while(o--)
{
scanf("%d",&n);//B国城市数量
for(i=;i<=n;i++) first[i]=d[i]=;//先全部清空一遍
len=;//清空
for(i=;i<n;i++)
{
scanf("%d%d",&x,&y);
ins(x,y);ins(y,x);//存储他们的边 因为是无向图 所以当做双向用
d[x]++;d[y]++;//x,y的度数分别加1
}
int max_d=,sec_d=;//max代指目前度数最大的点 sec代指度数第二大的点 _d代指这个度数的值
int max_s=,m1,m2;//max_s代表目前最大点的个数 m1记录第一个最大点的编号 m2代表第二个 当这两个点都有存储时代表有两个及以上,如果最大度数的点有三个及以上不用记录 一定有两个最大度数点不相连
int sec_s=;//第二大度数的点的个数
for(i=;i<=n;i++)//记录最大度数的点的个数以及第二大度数的点的个数
{
if(d[i]>max_d)//扫描到的点的度数如果比当前的最大的度数值要大
{
sec_d=max_d;
sec_s=max_s;//当前的“最大”度数变成第二大,更新第二大的度数点的相关数据
max_d=d[i];
max_s=;m1=i;//更新最大度数点 m1更新
}
else if(d[i]==max_d)
{
max_s++;//最大度数的点的个数+1
if(max_s==)m2=i;//m2更新
}
else if(d[i]>sec_d)//更新第二大的度数代表的一系列数据
sec_d=d[i],sec_s=;
else if(d[i]==sec_d)
sec_s++;
}//如果又else 什么都不用做 if(max_s>=){printf("%d\n",*max_d-);continue;}
if(max_s==)
{
if(is_conected(m1,m2))//判断两点是否相连
printf("%d\n",*max_d-);
else printf("%d\n",*max_d-);
continue;
}
//max_s=1;无需判断,直接操作
int s=;
for(k=first[m1];k;k=a[k].next)//扫描从x出发的第一条边开始 意为消除第一个城市然后确定连通块数量
{
y=a[k].y;
if(d[y]==sec_d) s++;//这两步的意思是寻找与x相连的sec,s为计数点
}
if(s==sec_s)//如果与max连接的点的数量与总的点的数量一样
printf("%d\n",max_d+sec_d-);//出推论
else printf("%d\n",max_d+sec_d-);//反之,出推论
}
return ;
}

好了大概就这么多

但是这个题没A,why?

因为!

我不会离散化(哭了)

好了如果你喜欢这篇题解别忘了点赞投币收藏……

诶?好像跑题了= =

集训模拟赛-1-T1的更多相关文章

  1. 冲刺$\mathfrak{CSP-S}$集训模拟赛总结

    开坑.手懒并不想继续一场考试一篇文. 既没必要也没时间侧边栏的最新随笔题解反思相间也丑 而且最近越来越懒了竟然都不写题解了……开坑也是为了督促自己写题解. 并不想长篇大论.简要题解也得写啊QAQ. 目 ...

  2. 10-18 noip提高组模拟赛(codecomb)T1倍增[未填]

    T1只想到了找环,> <倍增的思想没有学过,所以看题解看得雨里雾里的(最近真的打算学一下! 题目出的挺好的,觉得noip极有可能出现T1T2T3,所以在此mark 刚开始T1以为是模拟,还 ...

  3. 2017.9.23 NOIP2017 金秋杯系列模拟赛 day1 T1

    回形遍历( calc .cpp/c/pas) 时间限制:1s内存 限制: 256MB [问题 描 述] 给出一个 n*m 的棋盘,按如下方式遍历,请问(x,y)往后 z 步走到的是哪个格子. [输入] ...

  4. 模拟赛DAY1 T1大美江湖

    这就是一个模拟题,注意1234分别对应左右上下横坐标和纵坐标的判断就好了 题解: 需要注意的是,向上取整ceil函数是对于一个double值返回一个double值,也就是说在ceil里面的类型一定要是 ...

  5. 6.30集训模拟赛4(炸裂的一天qwq)

    T1浇水: 题目描述 在一条长n米,宽m米米的长方形草地上放置着k个喷水装置.假设长方形草地的坐标范围为[ 0 , 0 ] ~ [ n , m ],那么第 i 个喷水装置的位置为(ai,m/2),也就 ...

  6. 6.29模拟赛 (T1:李时珍的皮肤衣 T2:马大嘴的废话 T3:SSY的队列 T4:清理牛棚);

    啊,又是考炸的一天,成功的退步了三名,啊,成共的看错了T1  的题意 ,水了80分. 第十五名就是我,额,已经有点倒数的感觉了,并且一道题都没AC  我太难了. 好了,废话不多说了,下面正式提接: 这 ...

  7. 模拟赛18 T1 施工 题解

    前言: 真的是不容易啊.这个题在考场上想到了最关键的性质,但是没写出来. 后来写出来,一直调,小错不断. 没想到改的最后一个错误是两个int 乘起来爆了int 其实最后我还是觉得复杂度很假.\(n^2 ...

  8. 洛谷noip 模拟赛 day1 T1

    T7925 剪纸 题目描述 小芳有一张nnn*mmm的长方形纸片.每次小芳将会从这个纸片里面剪去一个最大的正方形纸片,直到全部剪完(剩下一个正方形)为止. 小芳总共能得到多少片正方形纸片? 输入输出格 ...

  9. 「2018-12-02模拟赛」T1 最短路 解题报告

    1.最短路(short.pas/cpp/in/out) 问题描述: 小 C 终于被小 X 感动了,于是决定与他看电影,然而小 X 距离电影院非常远,现在假设 每条道路需要花费小 X 的时间为 1,由于 ...

  10. 集训模拟赛-1-T2

    好了不要在铺垫了直接整吧就 题目拿来!!!!!!! 倒水 (water) (256MB,1s) [问题描述] 你有一个水桶(记为 0),两个杯子(记为 1,2).水桶中的水量无限,容量也无限.1 号杯 ...

随机推荐

  1. JAVA中Calendar 类的应用

    转自:https://www.imooc.com/code/2340 侵删! Date 类最主要的作用就是获得当前时间,同时这个类里面也具有设置时间以及一些其他的功能,但是由于本身设计的问题,这些方法 ...

  2. Python Requests-学习笔记(4)-定制请求头和POST

    定制请求头 如果你想为请求添加HTTP头部,只要简单地传递一个 dict 给 headers 参数就可以了. import jsonurl = 'https://api.github.com/some ...

  3. 七、环回接口ip地址(逻辑接口)

    loopback接口,在网络设备(一般是路由器)上是一种特殊的接口,它不是物理接口,而是一种看不见摸不着的逻辑接口(也称虚拟接口),但是对于网络设备来说却是至关重要的. 在网络设备上可以通过配置命令来 ...

  4. Jmeter常用元件

    1.测试计划:测试元件的容器,相当于一个项目名称 线程组:  2.监听器:负责收集测试结果,同时也被告知了结果显示的方式 (1)查看结果树:看具体某个请求——请求响应,结果明细 (2)聚合报告:汇总报 ...

  5. Tomorrow - 地形生成(1)

    原理很简单,请不要喷. 效果展示  种子输入框  种子为12345的地形  种子为23456的地形 代码展示 globalvar map random_set_seed(real(get_string ...

  6. 理解SVG的缩放 偏移的计算公式

    SVG中DOM元素的偏移与缩放都是基于SVG元素的左上角,所以如何理解与计算SVG中元素的真实位置就比较难,下面的例子都以圆(circle)为例. 1.缩放假定缩放的比例为s,执行缩放后,圆的圆心坐标 ...

  7. Three.js三维模型几何体旋转、缩放和平移

    创建场景中的三维模型往往需要设置显示大小.位置.角度,three.js提供了一系列网格模型对象的几何变换方法,从WebGL的角度看,旋转.缩放.平移对应的都是模型变换矩阵,关于矩阵变换内容可以观看本人 ...

  8. 安装Mathmatica

    MathMatica11.3版本 链接:https://pan.baidu.com/s/1YzQdgz4HxHd_xNwKoMX7lQ 提取码:mnr5 破解文件 链接:https://pan.bai ...

  9. 如何使用python,才能像人民日报的“点亮”武汉景点

    如何使用python,才能像人民日报的“点亮”武汉景点 前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者:Allen P ...

  10. windows批处理protoc生成C++代码

    1 首先需要生成protoc的可执行文件,具体可以参考  https://www.cnblogs.com/cnxkey/articles/10152646.html 2 将单个protoc文件生成.h ...