/*基本构图题,多源多汇,添加一个源点和一个汇点,所有源点都来自这个源点,同理,所有汇点

都汇于这个汇点,dinic第二战,本来应该1A的,犯了一个低级错误!while(scanf("%d))要加“~”啊!

SB了,记住这个教训!此次顺带学习了scanf的又一读入,忽略空格和已有符号,不错,并且更加了解了

dinic算法(为什么要添加反向弧?反向弧其实是提供悔棋的机会(每次回走相当于原来的流量又回来了(直接把容量看成剩余的流量),二,这题本身有反向弧,直接叠加即可,若走原图反向弧,相当于走这条路,走添加的反向弧,相当于反悔))。

但是为什么我的dinic要900MS啊!*/

未1A原因:while(scanf...)!!~~~~~!!!

#include<iostream>  //900MS
#include<cstdio>
#include<vector>
#include<queue>
using namespace std;
int n,np,nc,m;
const int inf=0x3f3f3f3f;
struct edge
{
int to,flow,pre;
};
edge e[24000];int head[120];
int vis[120],level[120];
bool bfs()
{
for(int i=0;i<=n+3;i++)
vis[i]=level[i]=0;
queue<int>q;
q.push(0);vis[0]=1;
while(!q.empty())
{
int cur=q.front();
q.pop();
for(int i=head[cur];i!=-1;i=e[i].pre)
{
int v=e[i].to;
if(!vis[v]&&e[i].flow>0)
{
vis[v]=1;
level[v]=level[cur]+1;
if(v==n+1)return 1; //优化之一
q.push(v);
}
}
}
return vis[n+1];
}
int dfs(int u,int minf) //minf 是目前为止残量
{
if(minf==0||u==n+1){return minf;}
int nowsumflow=0,zhihouflow;
for(int i=head[u];i!=-1&&minf;i=e[i].pre)
{
int v=e[i].to;int temp=e[i].flow;
if(level[v]==level[u]+1&&temp>0)
{
zhihouflow=dfs(v,minf<temp?minf:temp);
if(zhihouflow==0)continue;
e[i].flow-=zhihouflow;
e[i^1].flow+=zhihouflow;
nowsumflow+=zhihouflow;
minf-=zhihouflow;
}
}
return nowsumflow;
}
int main()
{
while(~scanf("%d%d%d%d",&n,&np,&nc,&m)) //没有加~!跪了N久
{
int s,l,f;int i,j;
for(int ii=0;ii<=n+4;ii++)
head[ii]=-1;
for(i =0;i<2*m;i++)
{
scanf(" (%d,%d)%d",&s,&l,&f);
if(s==l){i++;continue;}
e[i].to=l+1;e[i].pre=head[s+1];
head[s+1]=i;e[i].flow=f;
i++;
e[i].to=s+1;e[i].pre=head[l+1];
head[l+1]=i;e[i].flow=0;
}
for(j=i;j<2*np+i;j++)
{
scanf(" (%d)%d",&s,&f);
e[j].to=s+1;e[j].pre=head[0];
head[0]=j;e[j].flow=f;
j++;
e[j].to=0;e[j].pre=head[s+1];
head[s+1]=j;e[j].flow=0;
}
for(int k=j;k<2*nc+j;k++)
{
scanf(" (%d)%d",&s,&f);
e[k].to=n+1;e[k].pre=head[s+1];
head[s+1]=k;e[k].flow=f;
k++;
e[k].to=s+1;e[k].pre=head[n+1];
head[n+1]=k;e[k].flow=0;
}
long long sumcom=0;
while(bfs())
{
sumcom+=dfs(0,inf);
}
printf("%lld\n",sumcom);
}
return 0;
}

最新文章

  1. dubox首次调用消费者执行两次问题
  2. 总结一下响应式设计的核心CSS技术Media(媒体查询器)的用法。(转)
  3. 地图API文档
  4. CentOS6.5下RPM方式安装mysql5.6.33
  5. jquery插件参数传递
  6. 让Maven支持代理
  7. HTML&amp;CSS基础学习笔记1.5-添加常用标签
  8. &lt; meta &gt; 元素(转)
  9. 游戏 TRAP(SNRS)AlphaBeta版本
  10. 配置App真机测试证书的流程 一览
  11. 14、手把手教你Extjs5(十四)模块字段和Grid列的定义[2]
  12. 天方夜谈&#183;数据结构&#183;Queue
  13. python jquery
  14. hdu 5919 主席树(区间不同数的个数 + 区间第k大)
  15. (不断更新)关于显著性检测的调研-Salient Object Detection: A Survey
  16. 创建多线程的第二种方法实现Callable接口
  17. win10 家庭版修改hosts的权限
  18. BZOJ 3097: Hash Killer I
  19. LSTM输入层、隐含层及输出层参数理解【转载】
  20. matchmove流程中修改Maya相机数据的脚本

热门文章

  1. centos下升级python
  2. select2宽度占比100%,导致无法实现浮动效果
  3. 一次执行两个npm &quot;start&quot;: &quot;concurrently &#39;npm:dev&#39; &#39;npm:json-server&#39;&quot;
  4. flex布局以及相关属性
  5. Spring-01 注解实现IOC
  6. C#中byte类型运算
  7. 【2018 CCPC网络赛】1009 - 树
  8. l5-repository基本使用--结合使用artisan
  9. pytest以类形式的测试用例
  10. linux 配置文件要不要加上#! /bin/bash