思路:因為n<=200,而區間範圍為【1,100000】,因此需要離散化,去重,然後就是建圖了相連兩點連邊,容量為k,費用為0,然後就是對區間端點進行連邊,容量為1,費用為權值,最後就是跑費用流了。
1 #include2 #include3 #include4 #include5 #include6view codeusing
namespace
std;
7#define maxn 444
8#define maxm 444444
9#define inf 1<<30
1011
struct
edgeedge[maxm];
1415
intvs,vt,ne,n,m;
16int
head[maxn];
1718
void insert(int u,int v,int cap,int
cost)
1932
33int
pre[maxn],cur[maxn];
34int
dist[maxn];
35bool
mark[maxn];
36bool spfa(int vs,int
vt)3757}
58}59}
60return dist[vt]!=-inf;61}
6263
int mincostflow(int vs,int
vt)64
71 flow+=aug,cost+=dist[vt]*aug;
72for(int u=vt;u!=vs;u=pre[u])76}
77return
cost;78}
7980
struct
lineline[maxn];
8384
intnum[maxn];
8586
intmain()
87100 sort(num,num+cnt);
101 cnt=unique(num,num+cnt)-num;
102for(int i=1;i<=cnt;i++)
105for(int i=1;i<=n;i++)
110 printf("
%d\n
",mincostflow(0
,cnt));
111}
112return0;
113 }
poj 3680 最小費用最大流
思路 因為n 200,而區間範圍為 1,100000 因此需要離散化,去重,然後就是建圖了相連兩點連邊,容量為k,費用為0,然後就是對區間端點進行連邊,容量為1,費用為權值,最後就是跑費用流了。1 include2 include3 include4 include5 include6 using ...
POJ 3680 最小費用最大流
include include include include include include using namespace std const int maxn 500 const int maxm 1e5 10 const int inf 0x3f3f3f3f struct edge edge...
最小費用最大流POJ 3680
類似問題,比如有k的限制,某件事情只能做k次,或者事件一一對應,都可以建圖跑流來解決。比線段樹好使我感覺。從s 1 2 3 t建立一條通路 先離散化了頂點的,離散模板就好了 代價為零,流量為k 其實是多少無所謂,比k就行 然後如果1 3有區間的話,就建立一條負的代價,因為求的是最大費用,模板我們都是...