題意:給定\(n\)門課和\(m\)個學期,每門課在每個學期有不同的得分,需要選定乙個學期去完成,但存在約束條件,共有\(k\)對課程需要\(a\)在\(b\)開始學前學會,求最大得分(原問題是求最高平均得分)
把問題轉換為最小損失得分,那麼可以用最小割來求解
\(y[i][j]\)為第\(i\)門課在\(j\)學期損失的學分,若不存在則設為正無窮
那麼每一門課\(i\)都要拆\(m\)個點,表示為\((i,j)\),源\(s\)和\((i,1)\)的容量為\(y[i][1]\),其他學期相互連邊,容量為\(y[i][j]\),
注意到匯點\(t\)時是\((i,m)\)到\(t\),邊不可割,所以也為正無窮
前置課程需要保證\(b\)在第一學期不可能被割(正無窮邊),且\(a\)被割都得在\(b\)被割的前面,即對於\(i>1\)的學期都要有\((a,i-1)\)到\((b,i)\)的邊,容量為正無窮
#include#include#include#include#include#include#include#include#include#include#include#include#define rep(i,j,k) for(register int i=j;i<=k;i++)
#define rrep(i,j,k) for(register int i=j;i>=k;i--)
#define erep(i,u) for(register int i=head[u];~i;i=nxt[i])
#define iin(a) scanf("%d",&a)
#define lin(a) scanf("%lld",&a)
#define din(a) scanf("%lf",&a)
#define s0(a) scanf("%s",a)
#define s1(a) scanf("%s",a+1)
#define print(a) printf("%lld",(ll)a)
#define enter putchar('\n')
#define blank putchar(' ')
#define println(a) printf("%lld\n",(ll)a)
#define ios ios::sync_with_stdio(0)
using namespace std;
const int maxn = 1e6+11;
const int inf = 0x3f3f3f3f;
const double eps = 1e-7;
typedef long long ll;
ll read()
while(ch>='0'&&ch<='9')
return x*f;
}int to[maxn<<1],nxt[maxn<<1],cap[maxn<<1],flow[maxn<<1];
int head[maxn],tot;
void init()
void add(int u,int v,int w)
int n,m,s,t;
int dis[maxn],pre[maxn],cur[maxn],gap[maxn];
bool vis[maxn];
struct queue
void push(int u)
int pop()
bool empty()
}que;
void bfs()}}
}int aug()
u=t;
while(u!=s)
return ans;
}int isap()
}if(!ok)
if(--gap[dis[u]]==0) break;
dis[u]=mn+1;gap[dis[u]]++;cur[u]=head[u];
if(u!=s) u=to[pre[u]^1];}}
return ans;
}int x[233][333],y[233][333],id[233][333];
int a[233],b[333],k;
int main()
}rep(i,1,k)
s=n*m+1;t=n*m+2;
init();int cnt=0;
rep(i,1,n)
add(id[i][m],t,inf);
}rep(i,1,k)
}int r=n;
n=n*m+2; //note
ll ans=100*r-isap();
printf("%.2lf\n",(double)ans/r);
}return 0;
}
最小割問題
求最小割邊數 把第一遍dinic之後把網路中滿流量 殘量為0 的邊的殘量改為1,其餘的邊殘量改為無窮大,不含反向邊。再跑一次dinic即可得出答案 最小割邊一定是滿流的。給定乙個圖,求有多少邊增大流量可以使得從源點到匯點流量增大 其實就是求最小割的割邊是那些。我們先求一次網路流,之後在殘餘圖的基礎上...
最小割總結
最小割通常應用到有限制條件的問題上,初步學習時會較為難理解,希望在看完本文章後能對您有所幫助 兩大建模理解 最大權閉合子圖的思想 雖然和最大權閉合子圖有點像 有正負權和依賴關係 但具體的關係還是模糊的,所以往那方面想就肯定錯了 首先將所有裝置按正 源 負 匯 與超級點連線,容量為權值絕對值大小,在有...
字典序最小最小割
通常,構造最小割時,我們對殘量網路進行bfs,設能夠到達的集合為s,不夠到達的集合為t 遍歷時考慮反向邊 則從s指向t的邊被割掉。但是有時,需要求字典序最小的最小割。我們可以把所有的邊從小到大排序,並遍歷。如果當前邊可以刪除,那麼就刪除它,否則繼續。一條邊 u,v,w 能被刪除有2個條件 這條邊滿流...