考研系列 HDU2242之空調教室 tarjan

2022-05-02 11:57:10 字數 1934 閱讀 6950

眾所周知,hdu的考研教室是沒有空調的,於是就苦了不少不去圖書館的考研仔們。lele也是其中乙個。而某教室旁邊又擺著兩個未裝上的空調,更是引起人們無限yy。 

乙個炎熱的下午,lele照例在教室睡覺的時候,竟然做起了空調教室的美夢。 

lele夢到學校某天終於大發慈悲給某個教室安上了乙個空調。而且建造了了m條通氣管道,讓整個教學樓的全部教室都直接或間接和空調教室連通上,構成了教室群,於是,全部教室都能吹到空調了。 

不僅僅這樣,學校發現教室人數越來越多,單單乙個空調已經不能滿足大家的需求。於是,學校決定封閉掉一條通氣管道,把全部教室分成兩個連通的教室群,再在那個沒有空調的教室群裡添置乙個空調。 

當然,為了讓效果更好,學校想讓這兩個教室群裡的學生人數盡量平衡。於是學校找到了你,問你封閉哪條通氣管道,使得兩個教室群的人數盡量平衡,並且輸出人數差值的絕對值。 

input本題目包含多組資料,請處理到檔案結束。 

每組測試第一行包含兩個整數n和m(0

第二行有n個整數vi(0<=vi<=1000),分別代表每個教室的人數。 

接下來有m行,每行兩個整數ai,bi(0<=ai,bi

output對於每組資料,請在一行裡面輸出所求的差值。 

如果不管封閉哪條管道都不能把教室分成兩個教室群,就輸出"impossible"。 

sample input

4 3

1 1 1 1

0 11 2

2 34 3

1 2 3 5

0 11 2

2 3

sample outp01

1

雖然是1a,但是卡了一下縮點的問題,說明在邊雙連通和點雙連通的認知與區別上還不夠!

此外,沒有重新建邊,而是直接回溯,成立的原因是:

q從葉子節點回溯,符合」一刀兩段「的要求。

#include#include

#include

#include

#include

#include

#include

using

namespace

std;

const

int maxn=10010,maxm=40010

;int

laxt[maxn],next[maxm],to[maxm],cnt;

inta[maxn];

intlow[maxn],dfn[maxn];

inttimes,cut_cnt;

intq[maxm],top;

intmin,sum;

void

_init()

void _add(int u,int

v)void _tarjan(int u,int

pre)

if(!dfn[to[i]])

min=min(min,abs(sum-2*temp));//

成立的原因是:q從葉子節點回溯,就是樹形dp

a[u]+=temp;//

自己及其兒子的和

cut_cnt++;}}

else low[u]=min(dfn[to[i]],low[u]);

}}int

main()

for(i=0;i)

_tarjan(

1,-1

);

if(!cut_cnt) printf("

impossible\n");

else printf("

%d\n

",min);

}return0;

}

view code

HDU 2242(考研路茫茫 空調教室)

題意 有乙個教室群,教室之間有空調管相連 原圖連通 每個教室都有人,求斷開一條空調管使之分開成兩個教室群,並且使兩個教師群的人數差值最小。思路 這題沒什麼難度吧。思路都很明了 可能是看過標籤的緣故吧0.0 求邊雙連通分量,縮點,然後進行樹形dp計數求出答案即可,貼個 以後拿來當模板用吧。includ...

hdu 2242 考研路茫茫 空調教室

題意 給乙個雙聯通圖 有重邊 每乙個節點有權值,現在要求把以一條邊去掉,使得這個圖分為兩個部分,而且要使得這兩個部分的權的差的絕對值最小 思路 1,邊 雙連通求縮點,得到一顆樹 2,簡單樹形dp 這題難倒我好久,首先是各種hash使得mle,然後就是陣列開小了,沒有注意m的值有2w 最重大錯誤就在於...

HDU 2242 考研路茫茫 空調教室

眾所周知,hdu的考研教室是沒有空調的,於是就苦了不少不去圖書館的考研仔們。lele也是其中乙個。而某教室旁邊又擺著兩個未裝上的空調,更是引起人們無限yy。乙個炎熱的下午,lele照例在教室睡覺的時候,竟然做起了空調教室的美夢。lele夢到學校某天終於大發慈悲給某個教室安上了乙個空調。而且建造了了m...