Untitled
unknown
c_cpp
2 years ago
1.8 kB
4
Indexable
#include <bits/stdc++.h> using namespace std; #define MAXN 85 #define inf 1e9 int rest[MAXN][MAXN],orirest[MAXN][MAXN],pre[MAXN],mi[MAXN]; int n,m; bool bfs(int s,int e){ queue<int> q; memset(pre,-1,sizeof(pre)); //初始化為未走過 q.push(s); pre[s]=s; //起點標記為走過 mi[s]=inf; //起點能用的網路流量初始為最大(為了求最小值) while(!q.empty()){ int now=q.front();q.pop(); for(int i=1;i<=n;i++){ if(pre[i]==-1 && rest[now][i]){ //如果沒走過i且從now走到i的路還有流量 pre[i]=now; //記錄從哪裡來,以用來走inverse mi[i]=min(mi[now],rest[now][i]); //記錄每條路徑的最小值 if(i==e) return true; //如果走到終點就直接回傳,求最短路徑 q.push(i); } } } return false; //走不到end point } int main(){ cin >> n >> m; for(int i=0;i<m;i++){ int u,v,w=1; cin >> u >> v; orirest[u][v]+=w; //流量可累計 orirest[v][u]+=w; //流量可累計 } int ans=inf; for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ if(i==j) continue; memcpy(rest,orirest,sizeof(orirest)); memset(pre,0,sizeof(pre)); memset(mi,0,sizeof(mi)); int sum_flow=0; while(bfs(i,j)){ int increase_flow=mi[j]; sum_flow+=increase_flow; int now=j; while(now!=i){ rest[pre[now]][now]-=increase_flow; //減少還能用的流量 rest[now][pre[now]]+=increase_flow; //應加inverse流量 now=pre[now]; //回朔 } } ans=min(ans,sum_flow); } } cout << ans << '\n'; }
Editor is loading...