开篇

这是我写的第一篇记录好题的博客,也是博客园上我发布的第一篇博客。

以后我的所有博客都将在洛谷和博客园上同时发布,同志们有兴趣的在哪里都可以看一看。

[https://www.luogu.com.cn/blog/DarthVictor/#](洛谷博客)
[https://www.cnblogs.com/DarthVictor/](博客园)

那么今天要记录的就是:空调教室!

题目

题面

众所周知,HDU的考研教室是没有空调的,于是就苦了不少不去图书馆的考研仔们。Lele也是其中一个。而某教室旁边又摆着两个未装上的空调,更是引起人们无限YY。

一个炎热的下午,Lele照例在教室睡觉的时候,竟然做起了空调教室的美梦。

Lele梦到学校某天终于大发慈悲给某个教室安上了一个空调。而且建造了了M条通气管道,让整个教学楼的全部教室都直接或间接和空调教室连通上,构成了教室群,于是,全部教室都能吹到空调了。

不仅仅这样,学校发现教室人数越来越多,单单一个空调已经不能满足大家的需求。于是,学校决定封闭掉一条通气管道,把全部教室分成两个连通的教室群,再在那个没有空调的教室群里添置一个空调。

当然,为了让效果更好,学校想让这两个教室群里的学生人数尽量平衡。于是学校找到了你,问你封闭哪条通气管道,使得两个教室群的人数尽量平衡,并且输出人数差值的绝对值。

Input
    
本题目包含多组数据,请处理到文件结束。

每组测试第一行包含两个整数N和M(0<N<=10000,0<M<20000)。其中N表示教室的数目(教室编号从0到N-1),M表示通气管道的数目。

第二行有N个整数Vi(0<=Vi<=1000),分别代表每个教室的人数。
    
接下来有M行,每行两个整数Ai,Bi(0<=Ai,Bi<N),表示教室Ai和教室Bi之间建了一个通气管道。

Output

对于每组数据,请在一行里面输出所求的差值。

如果不管封闭哪条管道都不能把教室分成两个教室群,就输出"impossible"。

Sample Input

4 3

1 1 1 1

0 1

1 2

2 3

4 3
    
1 2 3 5
    
0 1
    
1 2
    
2 3

Sample Output

0
    
1

解说

这道题用的方法应该是Tarjan边双+缩点,网上大部分的讲解都说要用树形DP,但是还没学到,只能自己再想方法。

最开始的时候想简单了,觉得求出每个边双连通分量的人数,放进数组里,跑一遍背包,求出把这些数分成两组的最小差值,就行了,样例还过了,就是A不了……被老郭一说才发现这是个图啊,直接当一组数分的话一组可能根本连不起来……

只不过是从头再来……

改了改想法,求出边双之后先缩点,变成一棵树,然后……

我没听说过树形DP是个什么东西啊!

万能DFS吧。

随便找一个点作为根节点,DFS过程就是依次往下搜它的儿子,返回值就是它自己的权值加下面子孙的权值,每次加完abs(计算总人数-2 * 自己的人数),然后和ans取最小值。(不知道这个式子怎么来的?差值=(总人数-第一部分人数)-第一部分人数)

完成!Ура!

咦?还不对?

再检查发现犯了两个 极其愚蠢的 错误。边数组开的时候没乘2,ans初始值设成了1000(应为10000000,万一有10001个点,其中10000个一撮,每个点的权值都为1000呢?)

幸甚至哉,歌以咏志。

 #include<bits/stdc++.h>
using namespace std;
const int maxn=+,maxe=*+;
int head[maxn],dfn[maxn],low[maxn],rs[maxn],f[maxn],belong[maxn];
int h[maxn],ans;
bool bridge[maxe],vis[maxn];
int n,m,tot,sum,dfs_clock;bool judge;
struct edge{
int to,next;
}e[maxe],ed[maxe];
void Add(int a,int b){
e[tot].to=b;
e[tot].next=head[a];
head[a]=tot;
tot++;
}
void tarjan(int u,int id){
dfn[u]=low[u]=++dfs_clock;
for(int i=head[u];i;i=e[i].next){
if(i==(id^)) continue;
int v=e[i].to;
if(!dfn[v]){
tarjan(v,i);
low[u]=min(low[u],low[v]);
if(dfn[u]<low[v]){
judge=;
bridge[i]=bridge[i^]=;
}
}
else low[u]=min(low[u],dfn[v]);
}
}
void dfs(int x,int id){
vis[x]=;
f[id]+=rs[x];
belong[x]=id;
for(int i=head[x];i;i=e[i].next){
if(!bridge[i]&&!vis[e[i].to]) dfs(e[i].to,id);
}
}
int dfs2(int x){
vis[x]=;
for(int i=h[x];i;i=ed[i].next){
int to=ed[i].to;
if(!vis[to]) f[x]+=dfs2(to);
}
ans=min(ans,abs(sum-*f[x]));
return f[x];
}
int main(){
while(scanf("%d%d",&n,&m)!=EOF){
tot=; sum=; judge=; dfs_clock=;
memset(f,,sizeof(f));
memset(e,,sizeof(e));
memset(h,,sizeof(h));
memset(ed,,sizeof(ed));
memset(dfn,,sizeof(dfn));
memset(low,,sizeof(low));
memset(vis,,sizeof(vis));
memset(head,,sizeof(head));
memset(belong,,sizeof(belong));
memset(bridge,,sizeof(bridge));
for(int i=;i<=n;i++){
scanf("%d",&rs[i]);
sum+=rs[i];
}
for(int i=;i<=m;i++){
int a,b;
scanf("%d%d",&a,&b);
Add(a+,b+);
Add(b+,a+);
}
for(int i=;i<=n;i++) if(!dfn[i]) tarjan(i,head[i]);
if(!judge){
printf("impossible\n");
continue;
}
int id=;
for(int i=;i<=n;i++) {
if(!belong[i]){
id++;
dfs(i,id);
}
}
tot=;
for(int i=;i<=n;i++){
for(int j=head[i];j;j=e[j].next){
int from=belong[i],to=belong[e[j].to];
if(from!=to){
ed[tot].to=to;
ed[tot].next=h[from];
h[from]=tot;
tot++;
/*ed[tot].to=from;
ed[tot].next=h[to];
h[to]=tot;
tot++;*/
}
}
}
ans=;
memset(vis,,sizeof(vis));
dfs2();
printf("%d\n",ans);
} }

看看代码吧

开篇词The Start以及[Vjudge][HDU2242]空调教室的更多相关文章

  1. 【Bluetooth蓝牙开发】一、开篇词 | 打造全网最详细的Bluetooth开发教程

    个人主页:董哥聊技术 我是董哥,嵌入式领域新星创作者 创作理念:专注分享高质量嵌入式文章,让大家读有所得! 文章目录 1.前言 2.蓝牙综合介绍 3.精华文章汇总 4.结语 1.前言 大家好,我是董哥 ...

  2. 考研系列 HDU2242之空调教室 tarjan

    众所周知,HDU的考研教室是没有空调的,于是就苦了不少不去图书馆的考研仔们.Lele也是其中一个.而某教室旁边又摆着两个未装上的空调,更是引起人们无限YY. 一个炎热的下午,Lele照例在教室睡觉的时 ...

  3. HDU2242 考研路茫茫——空调教室 (双联通分+树形DP)

    考研路茫茫——空调教室 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  4. HDU 2242 考研路茫茫——空调教室 无向图缩环+树形DP

    考研路茫茫——空调教室 Problem Description 众所周知,HDU的考研教室是没有空调的,于是就苦了不少不去图书馆的考研仔们.Lele也是其中一个.而某教室旁边又摆着两个未装上的空调,更 ...

  5. HDU 2242 考研路茫茫----空调教室

    传送门 考研路茫茫——空调教室 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)T ...

  6. HDU 2242 考研路茫茫——空调教室

    考研路茫茫——空调教室 http://acm.hdu.edu.cn/showproblem.php?pid=2242 分析: 树形dp,删边. 代码: #include<cstdio> # ...

  7. HDU 2242 考研路茫茫——空调教室(边双连通)

    HDU 2242 考研路茫茫--空调教室 题目链接 思路:求边双连通分量.然后进行缩点,点权为双连通分支的点权之和,缩点完变成一棵树,然后在树上dfs一遍就能得出答案 代码: #include < ...

  8. hdu2242 考研路茫茫——空调教室

    弱联通 #include<iostream> #include<cstdio> #include<cstring> #include<map> #inc ...

  9. 深入剖析Kubernetes学习笔记:开篇词(00)

    一.关于Kubernetes初学的疑惑 就在这场因"容器"而起的技术变革中,kubernetes项目已经成为容器技术的事实标准,重新定义了基础设置领域对应用编排与管理的种种可能 1 ...

随机推荐

  1. Hexo 下 Markdown 的配置与学习

    本篇 更换 Hexo 下的 Markdown 渲染插件 学习 Markdown 基本语法 ✎更换 Markdown 渲染插件 ✎原因 Hexo 内置的默认渲染插件是 hexo-renderer-mar ...

  2. 用Excel做数据分析常用函数(数据清理、关联匹配……)

    本文总结在使用Excel进行数据分析时,最常用的功能和函数. Excel的功能和函数非常多,用进废退,除了学习基本的函数和功能,最重要的是遇到问题可以快速的搜索并解决. 首先Excel可以处理的数据量 ...

  3. F5 BIG-IP LTM会话保持

  4. python-django框架-电商项目-首页开发_20191122

    python-django框架-电商项目-首页开发 业务背景: 用户浏览网站一定是先到首页, 没有登陆的话首页内容完全一样,而且是不经常变化的, 一段时间内,有100用户访问,就要有几个用户就要查询多 ...

  5. Leaflet,OpenLayers3加载ArcGIS切片(png格式,Exploded松散型)

    需求 做了一个简单的WebGIS应用,不想因为加载切片就安装一台GIS服务器.于是想直接访问图片的方式来加载地图. 需解决的问题 leafletjs目前是不能够直接加载ArcGIS服务切片的,但可以借 ...

  6. SQL中的一些关键字用法

    1.where 条件筛选结果 select * from `表名` where `列名`='value' 上诉语句的意思是在某表中查询某列名等于某特定值得所有列 2.Like 模糊查询 select ...

  7. E丢丢App重设计总结

    E丢丢学习App是华夏大地教育可以有限公司旗下的一款产品,专为提升学历者打造,它整合了线上+跟踪的 (E平台)功能,方便工作人员随时随地管理账号.跟进学员:同时还可以随时了解教育行业的新闻资讯.一对一 ...

  8. LINQ之路 6:延迟执行(Deferred Execution) 笔记

    这里刚看的时候不理解. 这个特性在我们通过foreach循环创建查询时会变成一个真正的陷阱.假如我们想要去掉一个字符串里的所有元音字母,我们可能会写出如下的query: IEnumerable< ...

  9. js 原生轮播图插件

    <!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  10. 使用Commons Logging

    Commons Logging 和Java标准库提供的日志不同,Commons Logging是一个第三方日志库,它是由Apache创建的日志模块,需要导入commons-logging-1.2.ja ...