poj 1815(最小割 割集)

2021-09-06 11:43:16 字數 1672 閱讀 6091

思路:題目要求是剔除多少個點,可以將其轉化為剔除多少條邊,因此需要拆點,將點i拆成i,i+n,便容量為1,表示每個人起的傳遞作用只能是一次。然後就是列舉了,刪除某條邊,如果求出的最小割比原來的要小,說明減少的是割邊集。

1 #include2 #include3 #include4 #include5 #include6

using

namespace

std;

7#define maxn 444

8#define maxm 4444444

9#define inf 1<<30

1011

struct

edgeedge[maxm];

1415

intn,vs,vt,ne,nv;

16int

head[maxn];

1718

void insert(int u,int v,int

cap)

1930

31int

level[maxn],gap[maxn];

32void bfs(int

vt)3350}

51}5253

intpre[maxn],cur[maxn];

54int sap(int vs,int

vt)55

77 aug=inf;78}

79break;80

}81}82

if(flag)continue;83

int minlevel=nv;

84for(int i=head[u];i!=-1;i=edge[i].next)90}

91if(--gap[level[u]]==0)break

;92 level[u]=minlevel+1

;93 gap[level[u]]++;

94 u=pre[u];95}

96return

maxflow;97}

9899

intmap[maxn][maxn];

100int

cut[maxn];

101void

build()

102112

}113

}114

115int

main()

116126 vs+=n,nv=2*n;

127 memset(cut,0,sizeof

(cut));

128build();

129 maxflow=sap(vs,vt);

130 ans=0

;131

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

138else cut[i]=0

;139

}140 printf("

%d\n

",ans);

141bool flag=true

;142

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

147}

148 puts(""

);149

}150

return0;

151 }

view code

poj 1815 最小點割集

最小點割集求解方法 1.有向圖 把乙個點拆成 i,i n 2個點,之間容量為1。如果i,j 2個點在原圖中聯通,則將i n,j相連,容量為無窮大。然後求最小割,可見被最小割割到的都是容量是1的邊,如果割到一條inf,說明沒有最小點割集。而且那些邊必將連著i,i n,於是i就是被割的點。2.無向圖 把...

poj1815 最小割點集

題目大意 現代社會人們都靠 通訊。a 與 b 能通訊當且僅當 a 知道 b 的 號或者 a 知道 c 的 號且 c 與 b 能通訊。若 a 知道 b 的 號,那麼 b 也知道 a 的電 話號。然而不好的事情總是會發生在某些人身上,比如他的 本丟了,同時他 又換了 號,導致他跟所有人失去了聯絡。現在給...

poj 1815 最小割 列舉

題意 給乙個無向圖,求最少刪除多少個點,使得從s到t不連通,並輸出字典序最小的方案數。思路 拆點,從s到t跑一遍最小割,求出最少刪除的點數。關鍵是如何求字典序最小的方案,可以從1到n列舉每個點 拆成的邊 是否可以在最小割中,即把這個點所連的所有邊斷掉,再跑一遍最小割。如果最小割減小,就把這個點從割集...