題意:給乙個雙聯通圖(有重邊),每乙個節點有權值,現在要求把以一條邊去掉,使得這個圖分為兩個部分,而且要使得這兩個部分的權的差的絕對值最小;
思路:1,邊_雙連通求縮點,得到一顆樹
2,簡單樹形dp
這題難倒我好久,首先是各種hash使得mle,然後就是陣列開小了,沒有注意m的值有2w
最重大錯誤就在於建圖了,一開始是在dfs函式裡建圖,但是這是錯了,因為要low[site] == dfn[site] 我才建圖,沒有就會使得map儲存的東西丟失,導致最終的樹的邊會少很多。
所以,建圖要在dfs完了才建!!!!!
說到建圖,這題是我第乙個用鄰接表建的圖
首先,head的下標表示起點,end表示終點,next表示這條邊的上一條邊,next== -1表示結束struct edge;
int head[n];
edge err[n] ;
idx = 0 ;
void add_edge(int a ,int b)
**如下:
#include #include #include #include #include using namespace std ;
const int int = 30000+111 ;
struct graph ;
edge err[int] ;
int v ;
vectorstk ;
int head[int] ;
int instack[int] ;
int low[int] , dfn[int] ;
int point[int] ;
int power[int] ;
int visit_time , color , minp , allp , idx ;
int m ;
multimapmmap ;
void init()
void dfs(int site , int fa)
else if(instack[f] == 1)
}if(instack[f] > 1)
p = err[p].next ;
}if(low[site] == dfn[site])
stk.pop_back() ;
sum += point[site] ;
power[color] = sum ;
instack[site] = color++ ;}}
void add_edge(int a, int b)
void build_trie()
}void search(int site , int fa , int& right)
p = err[p].next ;
}right += now ;
int tmp = allp - 2*now ;
if(tmp < 0) tmp = -tmp ;
if(minp > tmp) minp = tmp ;
}void std_fun()
int a, b;
while(m--)
dfs(1 , 0) ;
if(color == 3)
build_trie() ;
int tmp = power[2] ;
search(2 , 0 , tmp ) ;
printf("%d\n",minp) ;
}};graph g ;
int main()
}
HDU 2242(考研路茫茫 空調教室)
題意 有乙個教室群,教室之間有空調管相連 原圖連通 每個教室都有人,求斷開一條空調管使之分開成兩個教室群,並且使兩個教師群的人數差值最小。思路 這題沒什麼難度吧。思路都很明了 可能是看過標籤的緣故吧0.0 求邊雙連通分量,縮點,然後進行樹形dp計數求出答案即可,貼個 以後拿來當模板用吧。includ...
HDU 2242 考研路茫茫 空調教室
眾所周知,hdu的考研教室是沒有空調的,於是就苦了不少不去圖書館的考研仔們。lele也是其中乙個。而某教室旁邊又擺著兩個未裝上的空調,更是引起人們無限yy。乙個炎熱的下午,lele照例在教室睡覺的時候,竟然做起了空調教室的美夢。lele夢到學校某天終於大發慈悲給某個教室安上了乙個空調。而且建造了了m...
HDU 2242 考研路茫茫 空調教室
hdu 2242 這個題目首先可以求出邊雙連通分量並進行縮點,如果邊雙連通分量的個數只有乙個的話就必然無解,之後我們把縮好的點建成乙個新圖,這個圖實際上就是一棵樹。如果我們隨便找個點當做樹根,並把圖畫成樹形結構的話,就會發現實際上我們只要求出除樹根外每個節點以及其下方的所有節點的權值和即可,每求出乙...