思路:tarjan求邊雙連通分量,進行縮點後成樹,然後就是樹型dp,求一下最小差值就行了。
ps:注意點:由於雙向建邊,dp搜尋時要記錄父親,只能往下搜,不能搜該節點的父親。
1 #include2 #include3 #include4 #include5 #include6 #include7view codeusing
namespace
std;
8#define maxn 10000+10
9#define inf 1<<30
10 stacks;
11 vectorvet[maxn];
12 vectormap[maxn];
13int
n,m,cnt,_count,sum,min;
14int
dfn[maxn],low[maxn];
15bool
mark[maxn];
16int
color[maxn];
17int
dp[maxn];
18int
value[maxn];
1920
//tarjan演算法找邊雙聯通分量並進行縮點
21void tarjan(int u,int
father)//
考慮重邊情況,重要
29if(!mark[v])tarjan(v,u);
30 low[u]=min(low[u],low[v]);31}
32if(low[u]==dfn[u])while(u!=v);41}
42}4344
//樹型dp求最小差值
45int dfs(int u,int
father)
52 min=min(min,abs((sum-ans)-ans));
53return
ans;54}
5556
5758
intmain()
64for(int i=0;i"
%d",&value[i]);sum+=value[i]; }
65while(m--)
70 memset(color,0,sizeof
(color));
71 memset(dfn,0,sizeof
(dfn));
72 memset(low,0,sizeof
(low));
73 memset(mark,false,sizeof
(mark));
74 memset(dp,0,sizeof
(dp));
75 tarjan(0,0
);76
if(_count==1)
77for(int i=0;i)82}
83}84 dfs(1,0
);85 printf("
%d\n
",min);86}
87return0;
88 }
HDU4738 邊雙連通分量
no response.注意連通麼?重邊怎麼處理啊?answer 0,聽說還需要人。the solution.1th.處理連通的話,推薦bfs!如果涉及圖遍歷問題!bfs!你以為dfs標記掉複雜度就低了麼?2nd.重邊處理的話,從u v避免v u.在利用鏈式前向星儲存圖,利用異或,like 0 1 ...
邊雙連通分量還有橋
我發現了兩種邊雙的寫法 1.先求橋,標記橋再dfs求連通塊,似乎有點麻煩 2.直接上有向圖的寫法,把回頭的情況標記一下 其1int tarjan int x,int fa else if fa 1 i fa 1 return 0 int dfss int x return 0 scanf d lld...
雙連通分量
在無向連通圖中,如果刪除該圖的任何乙個結點都不能改變該圖的連通性,則稱該圖是雙連通的。雙連通無向圖一定是連通的,而連通的無向圖則不一定是雙連通的。對於乙個連通的無向圖也有雙連通分量的概念,定義自然不言而喻。同樣,我們也可以利用tarjan演算法求雙連通分量。define n 10000 struct...