[网络流24题] 分配问题

来源:互联网 发布:浙江义乌淘宝网店培训 编辑:程序博客网 时间:2024/05/22 00:52

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.in

5

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 longusing 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(){;}
原创粉丝点击