poj 1815 最小割 列舉

2022-08-17 14:27:22 字數 1542 閱讀 7292

題意:給乙個無向圖,求最少刪除多少個點,使得從s到t不連通,並輸出字典序最小的方案數。

思路:拆點,從s到t跑一遍最小割,求出最少刪除的點數。

關鍵是如何求字典序最小的方案,可以從1到n列舉每個點(拆成的邊)是否可以在最小割中,即把這個點所連的所有邊斷掉,再跑一遍最小割。如果最小割減小,就把這個點從割集中刪除;否則,把這個點恢復。

**:

1 #include2 #include3

4using

namespace

std;

5 typedef long

long

ll;6

7const

int n=210;8

const

int m=1e5+10;9

const

int inf=0x3f3f3f3f;10

11int head[n<<1

],to[m],nxt[m],w[m];

12int cur[n<<1],d[n<<1],gap[n<<1

];13

inttot;

1415

bool

vis[n];

1617

intg[n][n];

1819

intn,s,t;

20int

ans[n];

2122 inline void add(int u,int v,int

x)26

27int dfs(int u,intin)

38}39if(!(--gap[d[u]])) d[s]=(n<<1)+1

;40 ++gap[++d[u]],cur[u]=head[u];

41return

out;42}

4344

intmain()

4551}52

if(g[s][t])

56 tot=1;57

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

61for(int i=1;i<=n;i++)67}

68}69int res=0;70

while(d[s]<=(n<<1)) res+=dfs(s,inf);

71int cnt=0;72

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

80for(int j=1;j<=n;j++)85}

86for(int j=1;j<=n;j++)93}

94}95int tmp=0;96

while(d[s]<=(n<<1)) tmp+=dfs(s,inf);

97if(tmp101else vis[i]=0

;102

}103 printf("

%d\n

",cnt);

104for(int i=1;i<=cnt;i++)

107return0;

108 }

poj 1815(最小割 割集)

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

最小點割集 poj 1815 貪心列舉

最小點割集 poj 1815 無向圖中至少刪掉多少點使得s,t不連通。最小點聯通度問題,最小點割集 將s看成源點,t看成匯點,將每個點拆成兩個點u和u 之間連容量為1的邊,原來從u到v的邊,變成從u 到v的邊,邊容量都是無窮大,新源點為s 新彙點還是t。題目需要輸出分數最小的點割集,即按字典序排序最...

poj 1815 最小點割集

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