740. [网络流24题] 分配问题
★★☆ 输入文件:job.in
输出文件:job.out
简单对比 时间限制:1 s 内存限制:128 MB
«问题描述:
有n件工作要分配给n个人做。第i 个人做第j 件工作产生的效益为c[i][j] 。试设计一个将 n件工作分配给n个人做的分配方案,使产生的总效益最大。«编程任务:
对于给定的n件工作和n个人,计算最优分配方案和最差分配方案。«数据输入:
由文件job.in提供输入数据。
文件的第1 行有1 个正整数n,表示有n件工作要分配给n 个人做。
接下来的n 行中,每行有n 个整数c[i][j] ,1≤i≤n,1≤j≤n,
表示第i 个人做第j件工作产生的效益为c[i][j] 。
«结果输出:
程序运行结束时,将计算出的最小总效益和最大总效益输出到文件job.out中。 输入文件示例 输出文件示例 job.in5
2 2 2 1 2
2 3 1 2 4
2 0 1 1 1
2 3 4 3 3
3 2 1 2 1
job.out
5
14
数据范围
N<=100最大-》建负边即得最大-》负到最小 取反得最大
#include<iostream> #include<cmath> #include<cstring> #include<cstdio> #include<queue> #include<map> #include<cstdlib> #include<algorithm> #define V 505 #define mod 1000000007 #define LL long long using namespace std; int n,m,sd,T,S,rt; int ff,ss,nn; int a[V],pre[V],dep[V],q[V],dis[V],pr[V],p; int sb[V][V]; int ins[V]; int b[V],s[V]; int fd,csd; struct da { int f,to,next,dis,cast; }Edge[V*V*2]; int head[V],tot; inline void add(int x,int y,int zz,int dd) { Edge[tot].f=x; Edge[tot].to=y; Edge[tot].dis=zz; Edge[tot].cast=dd; Edge[tot].next=head[x]; head[x]=tot++; Edge[tot].f=y; Edge[tot].to=x; Edge[tot].dis=0; Edge[tot].cast=-dd; Edge[tot].next=head[y]; head[y]=tot++; } bool FIND(int st,int ed) { //cout<<st<<endl; memset(dis,0x3f,sizeof(dis)); memset(ins,false,sizeof(ins)); memset(pr,0,sizeof(pr)); memset(s,0x3f,sizeof(s)); int inf; inf = dis[0]; queue <int> q; q.push(st), dis[st] = 0, s[st] = inf; while(!q.empty()) { int op = q.front(); q.pop(); for(int i = head[op] ; i != -1 ; i = Edge[i].next) { if(Edge[i].dis>0&&dis[Edge[i].to]>dis[op]+Edge[i].cast) { dis[Edge[i].to] = dis[op]+Edge[i].cast; pr[Edge[i].to] = i; s[Edge[i].to] = min(s[op],Edge[i].dis); //printf("i &&& %d to %d %d\n",i,Edge[i].to,dis[Edge[i].to]);//cout<<dis[Edge[i].to]<<" "<<Edge[i].to<<" "<<ed<<endl; if(!ins[Edge[i].to]) { ins[Edge[i].to] = true; q.push(Edge[i].to); } } } ins[op] = false; } //cout<<Cost<<endl; if(dis[ed]==inf) return false; fd += s[ed]; csd += dis[ed]*s[ed]; int w = ed; while(w!=st) { Edge[pr[w]].dis -= s[ed]; Edge[pr[w]^1].dis += s[ed]; w = Edge[pr[w]].f; } //cout<<Cost<<" $%"<<endl; return true; } int st[V][V]; inline int haha() { //freopen("in.txt","r",stdin);freopen("out.txt","w",stdout); freopen("job.in","r",stdin); freopen("job.out","w",stdout); memset(head,-1,sizeof(head)); cin>>n; int x; T=n+n+1; int zz=0; for(int i=1;i<=n;i++) { add(0,i,1,0); add(i+n,T,1,0); for(int j=1;j<=n;j++) { //cin>>x; cin>>st[i][j]; add(i,j+n,1,st[i][j]); } } while(FIND(S,T)); cout<<csd<<endl;//<<" %% "<<endl; tot=0; memset(head,-1,sizeof(head)); csd=0; T=n+n+1; //int zz=0; for(int i=1;i<=n;i++) { add(0,i,1,0); add(i+n,T,1,0); for(int j=1;j<=n;j++) { //cin>>x; //cin>>s[i][j]; add(i,j+n,1,-st[i][j]); } } while(FIND(S,T)); cout<<-csd<<endl; return 0; } int gg=haha(); int main() {;}