CodeChef RIN 最小割應用 規劃問題

2022-05-07 03:30:11 字數 2323 閱讀 8289

題意:給定\(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個條件 這條邊滿流...