/**
[最小點割集]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 的電 話號。然而不好的事情總是會發生在某些人身上,比如他的 本丟了,同時他 又換了 號,導致他跟所有人失去了聯絡。現在給...