題意:給乙個無向圖,求最少刪除多少個點,使得從s到t不連通,並輸出字典序最小的方案數。
思路:拆點,從s到t跑一遍最小割,求出最少刪除的點數。
關鍵是如何求字典序最小的方案,可以從1到n列舉每個點(拆成的邊)是否可以在最小割中,即把這個點所連的所有邊斷掉,再跑一遍最小割。如果最小割減小,就把這個點從割集中刪除;否則,把這個點恢復。
**:
1 #include2 #include34using
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.無向圖 把...