poj3177 雙連通分量

2021-07-05 07:07:04 字數 1055 閱讀 2603

無向圖,存成有向圖,一條邊存成兩條

強連通的時候就會導致重邊形成環,用fa記錄來自的邊,注意並且用flag判斷是否只有一條那樣的反向邊

求需要添多少條邊成雙連通,記度為1的強連通分量數為ans,結果為( ans + 1 ) / 2

#include #include#include#includeusing namespace std;

#define maxn 5000+5

#define for(i,j,k) for(int i=j;i<=k;i++)

struct edge

edge[5005*5005];

int chu[maxn],ru[maxn];//強連通分量的出度,入度

int dfn[maxn];//時間戳,dfs前訪問到該點和dfs後訪問該點

int low[maxn];//該點及其後代能連回的最早祖先值

int vis[maxn],stack[maxn],head[maxn],ans[maxn];

int belong[maxn];//每個點屬於幾號分量

int n;

int tot;//一共多少條邊

int cnt;//一共多少分量

int times,top;

void init()

void addedge(int from,int to)

void tarjan(int u,int fa)

if (vis[v]==0)

if (vis[v]==1)

low[u]=min(low[u],dfn[v]);

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

}}int main()

for(int i=1;i<=n;i++)

if(!vis[i])

tarjan(i,-1);

for(int i=1;i<=n;i++)

}int sum=0;

for(i,1,cnt)

printf("%d\n",(sum+1)/2);

}return 0;

}

poj 3177 邊連通分量

思路 dfs求出所有點的low值,然後對每個連通分量進行縮點,可以通過low來進行縮點。雖然在同一連通分量裡可能存在不同的low值,但這並不影響縮點。將每個連通分量縮為乙個點後,只要求出這個縮點後的樹上的葉子節點個數就行了。結果為 leaf 1 2。include include include i...

Poj 3177 雙聯通分量

題目大意 分析題解 個人 相關鏈結 啟發總結 特別是第四個!以前我了解了low的定義,但是卻沒有發現這個區別 我們平時使用的low,都是其子孫通過 一條返祖邊直接到達的點來決定的。如果我們把這個限制取消掉,按照其提供的做法,可以很簡單的對雙聯通分量進行染色。poj3177 求新增多少條邊可變連通圖。...

poj3177重修道路 邊雙連通分量縮點

題目 找橋,縮點,總之都是板子 對於每個葉子,互相連一條邊即可 若最後剩下乙個,則去和根節點連邊 所以葉子節點數 1再 2即答案。如下 include include include using namespace std int n,m,ct 1,head 5005 reg 5005 c 5005...