思路:從網上找了一下大牛對於這類問題的總結:圖的連通度問題是指:在圖中刪去部分元素(點或邊),使得圖中指定的兩個點s和t不連通 (不存在從s到t的路徑),求至少要刪去幾個元素。
圖的連通度分為點連通度和邊連通度:
(1)點連通度:只許刪點,求至少要刪掉幾個點(當然,s和t不能刪去,這裡保證原圖中至少有三個點);
(2)邊連通度:只許刪邊,求至少要刪掉幾條邊。
並且,有向圖和無向圖的連通度求法不同,因此還要分開考慮(對於混合圖,只需將其中所有的無向邊按照
無向圖的辦法處理、有向邊按照有向圖的辦法處理即可)。
有向圖的邊連通度:
這個其實就是最小割問題。以s為源點,t為匯點建立網路,原圖中的每條邊在網路中仍存在,容量為1,求該網路的最小割(也就是最大流)的值即為原圖的邊連通度。
有向圖的點連通度:
需要拆點。建立乙個網路,原圖中的每個點i在網路中拆成i'與i'',有一條邊,容量為1 (和例外,容量為正無窮)。原圖中的每條邊在網路中為邊,
容量為正無窮。以s'為源點、t''為匯點求最大流,最大流的值即為原圖的點連通度。
說明:最大流對應的是最小割。顯然,容量為正無窮的邊不可能通過最小割,也就是原圖中的邊和s、t兩個點不能刪去;若邊通過最小割,則表示將原圖中的點i刪去。
無向圖的邊連通度:
將圖中的每條邊(i, j)拆成和兩條邊,再按照有向圖的辦法()處理;
無向圖的點連通度:
將圖中的每條邊(i, j)拆成和兩條邊,再按照有向圖的辦法()處理。
於是對於本題我們可以列舉源點和匯點求解。
1 #include2 #include3 #include4 #include5 #include6view codeusing
namespace
std;
7#define maxn 111
8#define inf 1<<30910
struct
edgeedge[maxn*maxn];
1314
intn,m,ne,nv;
15int
head[maxn];
1617
void insert(int u,int v,int
cap)
1829
30int
level[maxn],gap[maxn];
31void bfs(int
vt)3249}
50}5152
intpre[maxn],cur[maxn];
53int sap(int vs,int
vt)54
76 aug=inf;77}
78break;79
}80}81
if(flag)continue;82
int minlevel=nv;
83for(int i=head[u];i!=-1;i=edge[i].next)89}
90if(--gap[level[u]]==0)break
;91 level[u]=minlevel+1
;92 gap[level[u]]++;
93 u=pre[u];94}
95return
maxflow;96}
9798
bool
map[maxn][maxn];
99void
build()
100108
}109
}110
111int
main()
112123 ans=inf;
124for(int vs=0;vs)
129}
130if(ans>=n)ans=n;
131 printf("
%d\n
",ans);
132}
133return0;
134 }
Tarjan求強連通 縮點 割點 割邊
1.如果乙個無向圖中每個頂點從所有其他頂點都是可達的,則稱該圖是連通的。圖的連通分量 從.可達 的等價類.2.如果乙個有向圖中任意兩點互相可達,則該有向圖是強連通的 相互可達 等價類 3.有向圖g v,e 的強連通分量是乙個最大節點集合c包含於v,對於該集合中任意節點u,v,節點u,v可以相互到達 ...
連通度(定點聯通度 邊聯通度)
無論是點 邊的聯通度都是用網路流的方法求解,驗證了我的那句話,萬物皆網路流 點聯通度 用網路流求解 拆點 原網路的點拆成 i i n 流量1 其他所有邊都為oo poj 1966 include include include include include using namespace std ...
點連通分量 邊連通分量 割點和橋 強連通分量
老是搞不清他們的關係,不知道該用那份 今天理了一下,整理一下模板 點連通分量 可以求出點連通分量包含哪些點,那個點屬於那個連通分量 struct edge int pre maxn iscut maxn bccno maxn dfs clock,bcc cnt vectorg maxn bcc ma...