最小點割集 poj 1815 貪心列舉

2021-06-09 03:02:23 字數 1242 閱讀 2184

/**

[最小點割集]poj 1815

無向圖中至少刪掉多少點使得s,t不連通。

最小點聯通度問題,最小點割集

將s看成源點,t看成匯點,

將每個點拆成兩個點u和u',之間連容量為1的邊,

原來從u到v的邊,變成從u'到v的邊,邊容量都是無窮大,

新源點為s',新彙點還是t。

題目需要輸出分數最小的點割集,即按字典序排序最小,

貪心地從最小標號的頂點到最大標號的頂點一次列舉,

每次刪除邊i和i',如果新的最大流比原來的最大流小,說明該點在最小點割集中,

否則,恢復邊i和i'

*/#include #include #include using namespace std;

const int inf=1<<30;

const int max=405;

int c[max][max],f[max][max],pre[max];

int dis[max],num[max],cur[max];

int s,t,n;

void bfs()}}

}int sap()

bfs();

u=s;

num[0]=2*n;

while(dis[s]<2*n)

aug=inf;

u=s;

}break;}}

if(flag)

continue;

if(--num[dis[u]]==0)

return flow;

dis[u]=inf;

for(v=1;v<=2*n;v++)

}dis[u]++;

num[dis[u]]++;

if(u!=s)

u=pre[u];

}return flow;

}int main()

}if(c[s][t])

int cnt = 0;

maxf = sap();

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

else

c[i][i+n] = 1;

if(!maxf)

break;

}printf("%d\n",cnt);

for(i = 0; i < cnt; ++i)

printf("%d ",ans[i]);

puts("");

return 0;

}

poj 1815 最小點割集

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

poj 1815(最小割 割集)

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

poj1815 最小割點集

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