hdu 2242 邊雙連通分量)

2021-09-06 10:11:33 字數 1557 閱讀 5062

思路:tarjan求邊雙連通分量,進行縮點後成樹,然後就是樹型dp,求一下最小差值就行了。

ps:注意點:由於雙向建邊,dp搜尋時要記錄父親,只能往下搜,不能搜該節點的父親。

1 #include2 #include3 #include4 #include5 #include6 #include7

using

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 }

view code

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...