考研路茫茫 空調教室 強連通 雙聯通分量

2022-05-01 16:18:12 字數 3837 閱讀 1072

problem description

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

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

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

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

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

input

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

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

output

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

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

sample input

4 31 1 1 1

0 11 2

2 34 3

1 2 3 5

0 11 2

2 3sample output01

用拓撲排序 各種資料都過了  死活wa

#include#include

#include

#include

using

namespace

std;

//input by bxd

#define rep(i,a,b) for(int i=(a);i<=(b);i++)

#define repp(i,a,b) for(int i=(a);i>=(b);--i)

#define ri(n) scanf("%d",&(n))

#define rii(n,m) scanf("%d%d",&n,&m)

#define riii(n,m,k) scanf("%d%d%d",&n,&m,&k)

#define rs(s) scanf("%s",s);

#define ll long long

#define pb push_back

#define rep(i,n) for(int i=0;i

#define clr(a,v) memset(a,v,sizeof a)

/////////////////////////////////

/#define inf 0x3f3f3f3f

const

int n=10000+5

;const

int m=2*n;

inthead[m],pos;

struct

edge

edge[m];

void add(int a,int

b)int tot,ind,cnt,stack[n],dfn[n],low[n],vis[n],belong[n],node[n],peo[n],in

[n];

intn,m;

vector

g[n];

void

init()

void tarjan(int

x)

else

if(vis[v])

low[x]=min(low[x],low[v]);

}if(dfn[x]==low[x])

while(x!=v);

}}int

main()

cnt=0

; rep(i,

1,n)

if(!dfn[i])tarjan(i);

int num=0

; rep(i,

1,n)

if(ok)g[u].pb(v),in[v]++,num++;}}

}printf(

"cnt=%d num=%d\n

",cnt,num);

if(num!=cnt-1||cnt==1

) printf(

"impossible\n");

else

int ans=inf;

while(!q.empty())}}

printf(

"%d\n

",ans);

}rep(i,

1,cnt)

g[i].clear();

init();

}return0;

}

view code

原來是雙聯通分量  頂不住了 待補

貼上大佬**:

#include#include

#include

#include

using

namespace

std;

const

int maxn = 10005

;const

int maxm = 20005

;int

n,m;

intva[maxn];

struct

node

node(

int a,int

b):to(a),next(b){}

}edge[maxm

<<1],tree[maxm<<1

];int

head[maxn],dfn[maxn],low[maxn],belong[maxn],thead[maxn],ans[maxn];

inttot,ti,coun,ttot,res,people;

stack

s;void add_edge(int u,int

v)void tarjan(int u,int

fa)

if(!dfn[v])

else

if(belong[v]==-1) low[u] =min(low[u],dfn[v]);

}if(low[u]==dfn[u])

while(y!=u);

}}int cbh(int u,int

fa) res = min(res,abs(2*sum-people));

return

sum;

}int

main()

memset(dfn,

0,sizeof

(dfn));

memset(low,

0,sizeof

(low));

memset(ans,

0,sizeof

(ans));

memset(belong,-1,sizeof

(belong));

coun = 0;ti = 0

; tarjan(

0,0);

if(coun==1)

//printf("%d\n",coun);

ttot = 0

; memset(thead,-1,sizeof

(thead));

memset(dfn,

0,sizeof

(dfn));

for(int i=0;i)}}

res = 0xfffffff

; cbh(

1,0);

printf(

"%d\n

",res);

}return0;

}

view code

考研路茫茫 空調教室 雙聯通分量 樹形DP

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

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

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

hdu 2242 考研路茫茫 空調教室

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