沒想到codevs上的資料和我本地的資料是一樣的……這下不用寫多餘的**了
這道題和上一道題一樣水,按照提議寫成二分圖就行。
1.源點向每個人連一條邊,容量1,費用0,每個任務向匯點連一條邊,容量1,費用0
2.每個人向每個任務連一條邊,容量1,費用為cij
跑兩次費用流就行
#include
#include
#include
#include
#include
#include
#include
using
namespace
std;
const
int maxn = 100000;
const
int maxm = 100000;
const
int inf = 0x3f3f3f3f;
struct edge
edge[maxm];
int head[maxn],tol;
int pre[maxn],dis[maxn];
bool vis[maxn];
int n;//節點總個數,節點編號從0~n-1
void init(int n)
void addedge(int u,int v,int cap,int cost)
bool spfa(int s,int t)
dis[s] = 0;
vis[s] = true;
q.push(s);
while(!q.empty())}}
}if(pre[t] == -1)
return
false;
else
return
true;
}//返回的是最大流,cost存的是最小費用
int mincostmaxflow(int s,int t,int &cost)
for(int i = pre[t]; i != -1; i = pre[edge[i^1].to])
flow += min;
}return flow;
}void print_all()
}int c[1001][1001];
int main()
}init(2*n+2);
int st = 0,en = 2 *n + 1;
for(int i = 1;i<=n;i++)
}int cost;
mincostmaxflow(0,2*n + 1,cost);
printf("%d\n",cost);
init(2*n+2);
st = 0,en = 2 *n + 1;
for(int i = 1;i<=n;i++)
}cost = 0;
mincostmaxflow(0,2*n + 1,cost);
printf("%d\n",-cost);
return
0;}
網路流二十四題
開始了我的網路流 24 題之旅,寫在一起到時候方便一起複習哦。其實這並不是真的二十四題,有一些過於水的我就不寫上來了。然後有的 太水了就不寫了。感覺這些題目還是比較基礎的,方法卻值得借鑑!剩餘題目 航空路線問題 火星探險問題以下 題目描述 點此看題 解法 你發現時間是最大的障礙,因為對於不同的時間飛...
網路流二十四題之十八 分配問題
有 n 件工作要分配給 n個人做。第 i 個人做第 j件工作產生的效益為 ci j 試設計乙個將 n 件工作分配給 n個人做的分配方案,使產生的總效益最大。對於給定的 n 件工作和 n個人,計算最優分配方案和最差分配方案。檔案的第 1 行有 1個正整數 n 表示有 n件工作要分配給 n 個人做。接下...
網路流二十四題之航空路線問題
這道題的建模很有意思 1.首先每個點,除了起點,都向拆點後的點練一天容量1,費用 1的邊,代表只能走一次,負費用是為了求最大的費用,也就是最多的經過點。對於起點,容量變成2,費用不變。2.其次對於一天航線,終點在拆點後的點集向起點連一條邊,容量無限,費用為0,代表兩個城市可以達到。之後一次費用流,如...