XJOI夏令营501-511NOIP训练14——好朋友
传送门:QAQQAQ
题意:noip2011就要来了,W校的同学们不仅看重这次比赛,更看重noip2011和谁住在同一个房间。同学之间的关系好坏可以用一个亲密值表示,亲密值越大,两个同学关系越好。小A作为W校信息组的组长,自然想要让同学们在比赛前能好好休息,放松心情,让同学们在赛场上能够超常发挥。他现在知道自己预订的房间都是双人间,且知道这n个同学之间的关系。n个同学的关系可以用一个n条双向边的连通图来描述,即某个同学只愿意和与他有边相连的同学住同一个房间,边权即为两个同学的亲密值。数据保证没有重边、自环。现在小A想知道在让所有同学的要求满足的情况下,亲密值最低的一对同学亲密值最高是多少。
思路:比赛的时候居然没想出来,打了个暴力只有30分。。。(这场比赛打炸了说)
这道题第一反应是二分,事实上只要$O(n)$贪心即可。
因为有$n$个点$n$条边,而且是个连通图,所以它是一个基环树(只有一个环),我们考虑只是一个树的情况:枚举每一个叶子结点,然后因为它们的度为1,所以只能和它们的父亲相连,然后和拓扑排序一样删边,遇到有点不能匹配或者有点匹配两次,就$No Answer$
我们就这样“拓扑排序”,剩下来没有搜到的点一定在一个环里而且这个环没有被破坏(这里需要人工YY一下),那么我们就可以对这个环进行染色,然后分两种情况求最小值即可。
代码:(强调!vector的size一定要转为int!)
#include<bits/stdc++.h>
using namespace std;
const int N=;
const int inf=(int)2e9; struct Edge{
int to,w;
Edge(){}
Edge(int to,int w) : to(to),w(w){}
};
vector<Edge> E[N];
vector<Edge> R; int F;
int n,ans=inf; int f,vis[N];
int deg[N],bl[N];
queue<int> q;
void dfs(int u,int f)
{
vis[u]=;
for(int i=;i<(int)E[u].size();i++)
{
int v=E[u][i].to;
if(v==f||bl[v]) continue;
R.push_back(E[u][i]);
if(!vis[v]) dfs(v,u);
break;
}
} int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++)
{
int x,y,W;
scanf("%d%d%d",&x,&y,&W);
E[x].push_back(Edge(y,W));
E[y].push_back(Edge(x,W));
deg[x]++; deg[y]++;
}
for(int i=;i<=n;i++)
if(deg[i]==) q.push(i);
int sum=;
while(!q.empty())
{
int u=q.front(),v=-; q.pop();
if(bl[u]) continue;
bl[u]=;
for(int i=;i<E[u].size();i++)
{
int now=E[u][i].to;//之前直接赋值为v,就算不成立下面也不会判
if(bl[now]) continue;
v=now;
ans=min(ans,E[u][i].w);
break;
}
if(v==-)
{
puts("no answer");
return ;
}
bl[v]=; sum+=;
for(int i=;i<(int)E[v].size();i++)
{
int p=E[v][i].to;
if(bl[p]) continue;
deg[p]--; if(deg[p]==) q.push(p);
}
}
if(sum==n)
{
cout<<ans<<endl;
return ;
}
for(int i=;i<=n;i++) if(!bl[i]) F=i;
dfs(F,-);
if((int)R.size()%==)
{
puts("no answer");
return ;
}
int now1=inf,now2=inf;
for(int i=;i<(int)R.size();i++)
{
if(i%==) now1=min(now1,R[i].w);//之前min写成加了
else now2=min(now2,R[i].w);
}
ans=min(ans,max(now1,now2));
cout<<ans<<endl;
return ;
}
XJOI夏令营501-511NOIP训练14——好朋友的更多相关文章
- XJOI夏令营501训练1——分配工作
传送门:QAQQAQ 题意:某公司有工作人员x1,x2,…,xn ,他们去做工作y1,y2,…,ym(n<=m) ,每个人都能做其中的几项工作,并且对每一项工作都有一个固定的效率.问能否找到一种 ...
- XJOI 夏令营501-511NOIP训练14 砍树(2)
小A是小B家的园丁.小B的家里有n棵树,第i棵树的横坐标为i.一天,小B交给小A一个任务,让他降低自己家中的某些树木的高度.这个任务对小A来说十分简单,因为他有一把极其锋利的斧头和一门独门砍树秘籍,能 ...
- test20190729 夏令营NOIP训练14
40+100+0=140. 基因光线 黑大帅统治古古怪界后,一直在玩一种很奇葩的游戏.在一个二维平面上,他先复制了n个小A,把他们放在不同的位置,然后射出一条ax+by+c=0的基因光线,宽度为d,即 ...
- XJOI 夏令营501-511NOIP训练18 高二学堂
在美丽的中山纪念中学中,有座高二学堂,同样也是因为一个人,让它们变 成了现在这个样子~那就是我们伟大的级主任.因为他,我们又迎来了一个木有电影,只有对答案的段考日:又迎来了一个不是大礼拜,而是小礼拜的 ...
- XJOI 夏令营501-511NOIP训练18 高三楼
参观完各种饭堂,学校还有什么著名的景点呢?当然是教室了,此时此刻我 们来到了高三楼.你会发现高三楼门口会有以身份认证系统,这东西还有着一段疼人的历史.每年的九月到来,高三的童鞋大多不习惯学校的作息时间 ...
- XJOI 夏令营501-511NOIP训练17 蛇形数阵
话说小X在孩提时,都会做标准的蛇形矩阵了,发现很好玩.现在的小X很想对其进行改版,变为如下类型的一个无限大蛇形数阵:令S(x)表示以1为左上角,x为右下角的矩形内所有数之和.例如S(12)就是具有深色 ...
- XJOI 夏令营501-511测试11 游戏
Alice和Bob两个人正在玩一个游戏,游戏有很多种任务,难度为p的任务(p是正整数),有1/(2^p)的概率完成并得到2^(p-1)分,如果完成不了,得0分.一开始每人都是0分,从Alice开始轮流 ...
- XJOI 夏令营501-511测试11 统计方案
小B写了一个程序,随机生成了n个正整数,分别是a[1]..a[n],他取出了其中一些数,并把它们乘起来之后模p,得到了余数c.但是没过多久,小B就忘记他选了哪些数,他想把所有可能的取数方案都找出来.你 ...
- FCN网络的训练——以SIFT-Flow 数据集为例
参考文章: http://blog.csdn.net/u013059662/article/details/52770198 caffe的安装配置,以及fcn的使用在我前边的文章当中都已经提及到了,这 ...
随机推荐
- Q:简单实现URL只能页面跳转,禁止直接访问
sessionStorage 用于临时保存同一窗口(或标签页)的数据,在关闭窗口或标签页之后将会删除这些数据,且不同标签页的session不能共享,通过此特性来控制某个页面只能通过上级页面同标签页跳转 ...
- windows10 自动配置切换IP
办公室与家里的ip网段不一样.每次都要来回修改本地无线WLAN IP段.写了个脚本bat,自动配置WLAN IP,方便切换. 建立 auto-set-ip.bat,保存格式需为ANSI,否则中文会乱码 ...
- 42 github 开源代码 ——README.md语法/相关操作等
0 引言 最近在github上开源了pro/E二次开发的代码,发现README.md的编辑方式很有趣,需要稍微了解一下. 1 markdown语法 参考了两篇博客的内容,链接如下. https://b ...
- NX二次开发-通过点击按钮来控制显示工具条
NX9+VS2012 1.打开D:\Program Files\Siemens\NX 9.0\UGII\menus\ug_main.men 找到装配和PMI,在中间加上一段 TOGGLE_BUTTON ...
- NX二次开发-UFUN获取圆锥参数UF_MODL_ask_cone_parms
NX11+VS2013 #include <uf.h> #include <uf_modl.h> #include <uf_ui.h> UF_initialize( ...
- HDU3342:判断有向图中是否存在3元环-Tarjan或拓扑排序
题目大意: 给你一个关系图,判断是否合法.每个人都有师父和徒弟,可以有很多个: 若A是B的师父,B是C的师父,则A也算C的师父. 不合法: 1) . 互为师徒:(有回路) 2) .你的师父是你徒弟 ...
- detours3.0文档翻译
拦截二进制函数 Detours库可以在运行过程中动态拦截函数调用.detours将目标函数前几个指令替换为一个无条件跳转,跳转到用户定义的detour函数.被拦截的函数保存在trampoline函数中 ...
- Mybatis笔记 - Mapper动态代理
使用Mybatis开发Dao,通常有两个方法,即原始Dao开发方法和Mapper接口开发方法. Mapper接口开发方式是基于入门程序的基础上,对 控制程序 进行分层开发,程序员只需要 编写mappe ...
- Python环境出现模块找不到
由于上周脚受伤了,修养了几天没有学习.今天去实验室发现我的编译器跑不动了,出现找不到模块的情况,很奇怪都安装了,也不会提示什么模块找不到. 查找了些资料,发现是因为某个模块的文件损坏或者被覆盖或者安装 ...
- SparkListener监听使用方式及自定义的事件处理动作
本文针对spark 2.0+版本 概述 spark 提供了一系列整个任务生命周期中各个阶段变化的事件监听机制,通过这一机制可以在任务的各个阶段做一些自定义的各种动作.SparkListener便是这些 ...