这题看了半天看不懂题意。。。还是看的网上题意写的

加一个源点一个汇点,把每个点拆成两个,这两个点的流量是v,其他联通的边都设为无穷大

输入没有1的点就与源点连接,输出只有1的点就与汇点连接

还有这个输出技巧,因为每条反向弧初始容量设置为0,因此完成增广之后,反向弧的容量即为路径。

#include<map>
#include<set>
#include<cmath>
#include<queue>
#include<stack>
#include<vector>
#include<cstdio>
#include<cassert>
#include<iomanip>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define pi acos(-1)
#define ll long long
#define mod 10007
#define ls l,m,rt<<1
#define rs m+1,r,rt<<1|1
#pragma comment(linker, "/STACK:1024000000,1024000000") using namespace std; const double g=10.0,eps=1e-;
const int N=+,maxn=+,inf=0x3fffff; int a[N][];
int s,t,n,p,pre[N];
bool vis[N];
int c[N][N];
bool bfs()
{
memset(pre,,sizeof pre);
memset(vis,,sizeof vis);
vis[s]=;
queue<int>q;
q.push(s);
while(!q.empty()){
int x=q.front();
q.pop();
if(x==t)return ;
for(int i=;i<=*n+;i++)
{
if(!vis[i]&&c[x][i])
{
vis[i]=;
q.push(i);
pre[i]=x;
}
}
}
return ;
}
int max_flow()
{
int ans=;
while(){
if(!bfs())break;
int minn=inf;
for(int i=t;i!=s;i=pre[i])
minn=min(minn,c[pre[i]][i]);
for(int i=t;i!=s;i=pre[i])
{
c[pre[i]][i]-=minn;
c[i][pre[i]]+=minn;
}
ans+=minn;
}
cout<<ans<<" ";
}
int main()
{
ios::sync_with_stdio(false);
cin.tie();
// cout<<setiosflags(ios::fixed)<<setprecision(2);
while(cin>>p>>n){
memset(c,,sizeof(c));
for(int i=;i<=n;i++)
{
cin>>c[i][i+n];
for(int j=;j<=p;j++)cin>>a[i][j];
for(int j=;j<=p;j++)cin>>a[i+n][j];
}
for(int i=;i<=n;i++)
{
bool flag=;
for(int j=;j<=p;j++)
if(a[i][j]==)
{
flag=;
break;
}
if(flag)c[][i]=inf;
flag=;
for(int j=;j<=p;j++)
if(a[i+n][j]!=)
{
flag=;
break;
}
if(flag)c[i+n][*n+]=inf;
}
for(int i=n+;i<=*n;i++)//前驱
{
for(int j=;j<=n;j++)//后继
{
bool flag=;
for(int l=;l<=p;l++)
{
if(a[j][l]+a[i][l]==)
{
flag=;
break;
}
}
if(flag)c[i][j]=inf;
}
}
/* for(int i=0;i<=2*n+1;i++)
{
for(int j=0;j<=2*n+1;j++)
cout<<c[i][j]<<" ";
cout<<endl;
}*/
s=;t=*n+;//t是汇点
max_flow();
int cnt=,a1[N],a2[N],a3[N];
for(int i=;i<=n;i++)
{
for(int j=;j<=n;j++)
{
if(i!=j&&c[j][i+n]>)
{
++cnt;
a1[cnt]=i;
a2[cnt]=j;
a3[cnt]=c[j][i+n];
}
}
}
cout<<cnt<<endl;
for(int i=;i<=cnt;i++)
cout<<a1[i]<<" "<<a2[i]<<" "<<a3[i]<<endl;
}
return ;
}

最新文章

  1. Ubuntu16.04LTS国内快速源
  2. ActiveX控件之ActiveXObject is not defined
  3. [Operate System &amp; Algorithm] 页面置换算法
  4. javascript的数值转换
  5. Effective C++ -----条款30:透彻了解inlining的里里外外
  6. OpenFlow.p4 源码
  7. LNMP(linux+nginx+mysql+php)服务器环境配置
  8. [Java] 匿名内部类
  9. 兼容,原来在这里就已经開始--------Day34
  10. oracle冷备份
  11. Count The Pairs
  12. JQ基础语法
  13. javascript运行机制详解: 再谈Event Loop(转)
  14. 初学Python(八)——迭代
  15. java虚拟机参数设置 jvm参数设置
  16. 如何在Eclipse中创建web项目并使用tomcat8 运行servlet开发简单的动态网页?
  17. Centos7.x做开机启动脚本
  18. 揭开JS闭包的面纱
  19. Python学习之旅(三十二)
  20. [转]Java NIO通俗易懂简明教程

热门文章

  1. Git源码安装
  2. Python爬虫scrapy-redis分布式实例(一)
  3. tow sum
  4. JavaScript高级程序设计第三版学习笔记(一)之数据类型区分详谈
  5. 完全用nosql轻松打造千万级数据量的微博系统(转)
  6. Mirror--镜像相关操作
  7. LVS和nginx反向代理网站架构
  8. java-基础-【三】try/catch/finally
  9. java构建树用的Node
  10. STL学习笔记---STL简介