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#includeview code#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;
}
原來是雙聯通分量 頂不住了 待補
貼上大佬**:
#include#includeview code#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;
}
考研路茫茫 空調教室 雙聯通分量 樹形DP
problem description 眾所周知,hdu的考研教室是沒有空調的,於是就苦了不少不去圖書館的考研仔們。lele也是其中乙個。而某教室旁邊又擺著兩個未裝上的空調,更是引起人們無限yy。乙個炎熱的下午,lele照例在教室睡覺的時候,竟然做起了空調教室的美夢。lele夢到學校某天終於大發慈悲...
HDU 2242(考研路茫茫 空調教室)
題意 有乙個教室群,教室之間有空調管相連 原圖連通 每個教室都有人,求斷開一條空調管使之分開成兩個教室群,並且使兩個教師群的人數差值最小。思路 這題沒什麼難度吧。思路都很明了 可能是看過標籤的緣故吧0.0 求邊雙連通分量,縮點,然後進行樹形dp計數求出答案即可,貼個 以後拿來當模板用吧。includ...
hdu 2242 考研路茫茫 空調教室
題意 給乙個雙聯通圖 有重邊 每乙個節點有權值,現在要求把以一條邊去掉,使得這個圖分為兩個部分,而且要使得這兩個部分的權的差的絕對值最小 思路 1,邊 雙連通求縮點,得到一顆樹 2,簡單樹形dp 這題難倒我好久,首先是各種hash使得mle,然後就是陣列開小了,沒有注意m的值有2w 最重大錯誤就在於...