對請求拆點建圖
對於乙個請求,如果 \(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函式,看有沒有空餘的...