國家集訓隊 航班安排 最小費用最大流

2022-06-07 03:12:08 字數 1203 閱讀 3110

對請求拆點建圖

對於乙個請求,如果 \(0\) 時刻可以從 \(0\) 機場到這裡,那麼 \(s\) 向它連邊,流量 \(\infty\),費用為 \(-w\)

結束時間飛回 \(0\) 小於時間限制,則向著 \(t\) 連邊,費用為 \(-w\)

兩兩枚舉所有請求,如果來得及就同理連邊

最後別忘了限制一下總流量

跑最小費用最大流即可

#include using namespace std;

#define int long long

// init: init() !!!!!

// input: make(u,v,cap,cost)

// solver: solve(s,t)

// output: ans, cost

namespace flow e[n];

int s, t, tans, ans, cost, ind, bus[n], qhead = 0, qtail = -1, qu[m],vis[n], dist[n];

void graph_link(int p, int q, int c, int w)

void make(int p, int q, int c, int w)

int dinic_spfa()

}return dist[t] < inf;

}int dinic_dfs(int p, int lim)

}return ret;

}void solve(int _s,int _t)

}void init()

}struct query q[205];

int n,m,k,t,t[205][205],f[205][205];

signed main()

}for(int i=1;i<=n;i++)

}for(int i=1;i<=m;i++)

if(t-q[i].t >= t[q[i].b][1])

}for(int i=1;i<=m;i++) }}

flow::make(2*m+3,2*m+1,k,0);

flow::solve(2*m+3,2*m+2);

cout<

}

國家集訓隊 航班安排

本題首先把每個請求拆點,然後我們只需要判斷時間限制,再來連邊就行了 注意給出的 f,t 兩個矩陣都是在空載情況下的定義 include define inf 1926081700 using namespace std const int n 211 int n,m,k,edt,cnt 1,s,t ...

bzoj 工作安排(最小費用最大流)

裸的最小費用最大流 思路是弄乙個原點,弄乙個會點,將原點連上物品容量為c i 費用為零,將物品和人按a陣列的關係連起來,容量為inf,花費為零,然後將人和會點連起來容量為他 做幾件物品,也就是ss j ss j 1 花費為他做這幾件的憤怒值,再跑最大流最小費用演算法就行了 複製 using name...

bzoj 2034 2009國家集訓隊 最大收益

這個題,我想的是用一些神奇的線段樹做法,根本沒想匹配 但是好像很顯然啊 寫的也太長了.給的l,r範圍很大,其實有用的只有n個時刻 那可以先離散一下 然後把 各個線段按照權值從大到小排序,乙個乙個選 有矛盾一定選擇權值大的,所以前面選定的集合一定是最優的 然後自己 裡說的check函式,看有沒有空餘的...