無向圖,存成有向圖,一條邊存成兩條
強連通的時候就會導致重邊形成環,用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...