思路:題目要求是剔除多少個點,可以將其轉化為剔除多少條邊,因此需要拆點,將點i拆成i,i+n,便容量為1,表示每個人起的傳遞作用只能是一次。然後就是列舉了,刪除某條邊,如果求出的最小割比原來的要小,說明減少的是割邊集。
1 #include2 #include3 #include4 #include5 #include6view codeusing
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 }
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列舉每個點 拆成的邊 是否可以在最小割中,即把這個點所連的所有邊斷掉,再跑一遍最小割。如果最小割減小,就把這個點從割集...