cogs 740 分配问题

«问题描述:

有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

发随笔也是颓废时的一种掩饰,,

2333

hhh,,

随便抄的。。

z学长的

ac代码:

 1 /*
 2     简单的费用流。 
 3 */ 
 4 #include<iostream>
 5 #include<cstdio>
 6 #include<cstring>
 7 #include<queue>
 8 #define N 210
 9 #define inf 1000000000
10 using namespace std;
11 int a[N][N],head[N],dis[N],inq[N],fa[N],n,S,T,cnt=1,ans;
12 struct node{int v,f,w,pre;}e[N*N*4];
13 queue<int> q;
14 void add(int u,int v,int f,int w){
15     e[++cnt].v=v;e[cnt].f=f;e[cnt].w=w;e[cnt].pre=head[u];head[u]=cnt;
16     e[++cnt].v=u;e[cnt].f=0;e[cnt].w=-w;e[cnt].pre=head[v];head[v]=cnt;
17 }
18 bool spfa(){
19     for(int i=0;i<=T;i++) dis[i]=inf;
20     q.push(S);dis[S]=0;
21     while(!q.empty()){
22         int u=q.front();q.pop();inq[u]=0;
23         for(int i=head[u];i;i=e[i].pre)
24             if(e[i].f&&dis[e[i].v]>dis[u]+e[i].w){
25                 dis[e[i].v]=dis[u]+e[i].w;
26                 fa[e[i].v]=i;
27                 if(!inq[e[i].v]){
28                     q.push(e[i].v);
29                     inq[e[i].v]=1;
30                 }
31             }
32     }
33     return dis[T]!=inf;
34 }
35 void updata(){
36     int i=fa[T],x=inf;
37     while(i){
38         x=min(x,e[i].f);
39         i=fa[e[i^1].v];
40     }
41     i=fa[T];
42     while(i){
43         e[i].f-=x;
44         e[i^1].f+=x;
45         i=fa[e[i^1].v];
46     }
47     ans+=x*dis[T];
48 }
49 void work(int fl){
50     memset(head,0,sizeof(head));
51     S=0;T=n*2+1;cnt=1;ans=0;
52     for(int i=1;i<=n;i++)
53         add(S,i,1,0),add(i+n,T,1,0);
54     for(int i=1;i<=n;i++)
55         for(int j=1;j<=n;j++)
56             add(i,j+n,1,a[i][j]*fl);
57     while(spfa())
58         updata();
59     printf("%d\n",ans*fl);
60 }
61 int main(){
62     freopen("job.in","r",stdin);
63     freopen("job.out","w",stdout);
64     scanf("%d",&n);
65     for(int i=1;i<=n;i++)
66         for(int j=1;j<=n;j++)
67             scanf("%d",&a[i][j]);
68     work(1);work(-1);
69     return 0;
70 }

如果你不开心,那我就把右边这个帅傻子分享给你吧,
你看,他这么好看,跟个zz一样看着你,你还伤心吗?
真的!这照片盯上他五秒钟就想笑了。
一切都会过去的。
时间时间会给你答案2333

 

猜你喜欢

转载自www.cnblogs.com/Mary-Sue/p/9270793.html