博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
poj 2112
阅读量:6926 次
发布时间:2019-06-27

本文共 4488 字,大约阅读时间需要 14 分钟。

1 #include 
2 #include
3 const int MAXN=250;//点数的最大值 4 const int MAXM=12500;//边数的最大值 5 const int INF=0x3fffffff; 6 7 struct Node 8 { 9 int from,to,next; 10 int cap; 11 }edge[MAXM]; 12 13 int tol; 14 int head[MAXN]; 15 int dep[MAXN]; 16 int gap[MAXN];//gap[x]=y :说明残留网络中dep[i]==x的个数为y 17 int matrix[250][250]; 18 int n;//n是总的点的个数,包括源点和汇点 19 20 void init() 21 { 22 tol=0; 23 memset(head,-1,sizeof(head)); 24 } 25 26 void addedge(int u,int v,int w) 27 { 28 edge[tol].from=u; 29 edge[tol].to=v; 30 edge[tol].cap=w; 31 edge[tol].next=head[u]; 32 head[u]=tol++; 33 edge[tol].from=v; 34 edge[tol].to=u; 35 edge[tol].cap=0; 36 edge[tol].next=head[v]; 37 head[v]=tol++; 38 } 39 void BFS(int start,int end) 40 { 41 memset(dep,-1,sizeof(dep)); 42 memset(gap,0,sizeof(gap)); 43 gap[0]=1; 44 int que[MAXN]; 45 int front,rear; 46 front=rear=0; 47 dep[end]=0; 48 que[rear++]=end; 49 while(front!=rear) 50 { 51 int u=que[front++]; 52 if(front==MAXN)front=0; 53 for(int i=head[u];i!=-1;i=edge[i].next) 54 { 55 int v=edge[i].to; 56 if(dep[v]!=-1)continue; 57 que[rear++]=v; 58 if(rear==MAXN)rear=0; 59 dep[v]=dep[u]+1; 60 ++gap[dep[v]]; 61 } 62 } 63 } 64 int SAP(int start,int end) 65 { 66 int res=0; 67 BFS(start,end); 68 int cur[MAXN]; 69 int S[MAXN]; 70 int top=0; 71 memcpy(cur,head,sizeof(head)); 72 int u=start; 73 int i; 74 while(dep[start]
edge[S[i]].cap) 82 { 83 temp=edge[S[i]].cap; 84 inser=i; 85 } 86 for(i=0;i
dep[edge[i].to])113 {114 min=dep[edge[i].to];115 cur[u]=i;116 }117 }118 --gap[dep[u]];119 dep[u]=min+1;120 ++gap[dep[u]];121 if(u!=start)u=edge[S[--top]].from;122 }123 }124 return res;125 }126 void floyd(int matrix[250][250],int n)127 {128 for(int k = 1;k <= n;k++)129 {130 for(int i = 1;i <= n;i++)131 {132 for(int j = 1;j <= n;j++)133 {134 if(matrix[i][j] > matrix[i][k] + matrix[k][j])135 {136 matrix[i][j] = matrix[i][k] + matrix[k][j];137 }138 }139 }140 }141 }142 int main()143 {144 int k,c,m;145 while(~scanf("%d%d%d",&k,&c,&m))146 {147 for(int i = 1;i <= k + c;i++)148 {149 for(int j = 1;j <= k + c;j++)150 {151 scanf("%d",&matrix[i][j]);152 if(matrix[i][j] == 0 && i != j)153 {154 matrix[i][j] =INF;155 }156 }157 }158 floyd(matrix,k + c);159 int ans = 0;160 for(int i = k + 1;i <= k + c;i++)161 {162 for(int j = 1;j <= k;j++)163 {164 if(matrix[i][j] > ans)165 {166 ans = matrix[i][j];167 }168 }169 }170 int s = 0,t = k + c + 1;171 n = k + c + 2;172 int right = ans,left = 0;173 while(left + 1 < right)174 {175 int mid = (left + right) / 2;176 init();177 for(int i = k + 1;i <= k + c;i++)178 {179 addedge(s,i,1);180 for(int j = 1;j <= k;j++)181 {182 if(matrix[i][j] <= mid)183 {184 addedge(i,j,1);185 }186 }187 }188 for(int j = 1;j <= k;j++)189 {190 addedge(j,t,m);191 }192 if(SAP(s,t) == c)193 {194 right = mid;195 }196 else197 {198 left = mid;199 }200 }201 printf("%d\n",right);202 }203 return 0;204 }

 

题意:给出奶牛、机器之间的距离(包括奶牛-奶牛距离,机器-机器距离,奶牛-机器距离),以及机器的处理奶牛的最大数量,求走得最远的奶牛可以走的最近距离。

分析:源点构造边,指向每一个奶牛顶点,容量为1(因为每个顶点的奶牛数量都是1),然后二分法枚举最短的距离,奶牛-机器距离不大于限定的距离的建一条由奶牛指向机器的边,容量为1,每个机器都建一条指向汇点的边,容量为m.

 

转载于:https://www.cnblogs.com/ZShogg/p/3231514.html

你可能感兴趣的文章
图灵等价和图灵完备
查看>>
CSS中position的absolute和relative的应用
查看>>
对 makefile 中 二次扩展的一点理解
查看>>
SET XACT_ABORT on
查看>>
记录mysql性能查询过程
查看>>
数据连接 DataDirectory 中的作用
查看>>
持续更新 iText in Action 2nd Edition中文版 个人翻译
查看>>
树、森林和二叉树的转换
查看>>
SSH重新登录的问题
查看>>
sys.path.insert(0, os.path.join('..', '..', '..', '..','...')) 解释
查看>>
开启mysql慢查询日志
查看>>
WEB项目的分层结构
查看>>
如果通过key获取dictionary里面的value
查看>>
【Java学习笔记】使用split()方法分割字符串
查看>>
我的架构经验系列文章 - 前端架构
查看>>
C#和C++的区别
查看>>
windows server 2003 sp2安装VS2010之后需要打的几个布丁
查看>>
推荐几个我日常使用的IT在线测试工具
查看>>
回合制页游
查看>>
IIS 内部运行机制
查看>>