题目链接:https://cn.vjudge.net/contest/68128#problem/A

反思:注意拆点,否则的话节点就没用了,还有注意源点和汇点的赋值。

AC代码:

#include<iostream>
#include<string>
#include<cstring>
#include<iomanip>
#include<stack>
#include<queue>
#include<stdio.h>
#include<algorithm>
using namespace std;
# define inf 0x3f3f3f3f
# define maxn 100+10
# define ll long long
int p,n;
int ori[maxn][maxn],nex[maxn][maxn];
int pre[maxn],vis[maxn];
int u[maxn],v[maxn],w[maxn];
struct node
{
int cost;
int in[maxn];
int out[maxn];
} a[maxn];
void init()
{
memset(ori,0,sizeof(ori));
memset(nex,0,sizeof(nex));
a[1].cost=inf;
for(int i=1; i<=p; i++)
{
a[1].in[i]=0;
a[1].out[i]=0;
a[n+2].in[i]=1;
a[n+2].out[i]=1;
}
a[n+2].cost=inf;
}
bool judge(int t1,int t2)
{
for(int i=1; i<=p; i++)
{
if(a[t1].out[i]!=a[t2].in[i]&&a[t2].in[i]!=2)return false;//多也不行,少也不行。
}
return true;
}
bool bfs(int st,int ed)
{
queue<int>q;
memset(vis,0,sizeof(vis));
vis[st]=1;
q.push(st);
pre[st]=st;
while(!q.empty())
{
int top=q.front();
q.pop();
for(int i=1; i<=2*n; i++)
{
if(vis[i]==0&&nex[top][i])
{
vis[i]=1;
pre[i]=top;
if(i==ed)return true;
q.push(i);
}
}
}
return false;
}
int EK(int st,int ed)
{
int ans=0;
while(bfs(st,ed))
{
int minn=inf ;
for(int i=ed; i!=st; i=pre[i])
{
minn=min(minn,nex[pre[i]][i]);
}
for(int i=ed; i!=st; i=pre[i])
{
nex[pre[i]][i]-=minn;
nex[i][pre[i]]+=minn;
}
ans+=minn;
}
return ans;
}
int main()
{
while(~scanf("%d%d",&p,&n))
{
init();
for(int i=2; i<=n+1; i++)//从2开始是为了把1当做源点
{
scanf("%d",&a[i].cost);
for(int j=1; j<=p; j++)
{
scanf("%d",&a[i].in[j]);
}
for(int j=1; j<=p; j++)
{
scanf("%d",&a[i].out[j]);
}
}
n+=2;//和原来相比加入了源点和汇点
for(int i=1; i<=n; i++)
{
for(int j=1; j<=n; j++)
{
if(i==j)
{
ori[i][j+n]=nex[i][j+n]=a[i].cost;
}
else if(i!=j&&judge(i,j))
{
ori[i+n][j]=nex[i+n][j]=a[i].cost;
}
}
}
int ans=EK(1,n*2);
int num=0;
for(int i=2; i<n; i++)
{
for(int j=2; j<n; j++)
{
if(ori[i+n][j]>nex[i+n][j])//如果拆点后当前流的流量变小了,说明这条路上有流量。
{
u[++num]=i;
v[num]=j;
w[num]=ori[i+n][j]-nex[i+n][j];
}
}
}
printf("%d %d\n",ans,num);
for(int i=1; i<=num; i++)
{
printf("%d %d %d\n",u[i]-1,v[i]-1,w[i]);
}
}
return 0;
}

A - ACM Computer Factory(网络流)的更多相关文章

  1. POJ 3436:ACM Computer Factory 网络流

    ACM Computer Factory Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6247   Accepted: 2 ...

  2. POJ - 3436 ACM Computer Factory 网络流

    POJ-3436:http://poj.org/problem?id=3436 题意 组配计算机,每个机器的能力为x,只能处理一定条件的计算机,能输出特定的计算机配置.进去的要求有1,进来的计算机这个 ...

  3. POJ 3436 ACM Computer Factory (网络流,最大流)

    POJ 3436 ACM Computer Factory (网络流,最大流) Description As you know, all the computers used for ACM cont ...

  4. POJ-3436 ACM Computer Factory(网络流EK)

    As you know, all the computers used for ACM contests must be identical, so the participants compete ...

  5. A - ACM Computer Factory POJ - 3436 网络流

    A - ACM Computer Factory POJ - 3436 As you know, all the computers used for ACM contests must be ide ...

  6. POJ3436 ACM Computer Factory(最大流/Dinic)题解

    ACM Computer Factory Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 8944   Accepted: 3 ...

  7. POJ 3464 ACM Computer Factory

    ACM Computer Factory Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 4829 Accepted: 1641 ...

  8. ACM Computer Factory(dinic)

    ACM Computer Factory Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 5596   Accepted: 1 ...

  9. ACM Computer Factory

    ACM Computer Factory Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 6104 Accepted: 2113 ...

随机推荐

  1. 计算机网络【8】—— Get和Post请求的区别

    get参数通过url传递,post放在request body中. get请求在url中传递的参数是有长度限制的,而post没有. get比post更不安全,因为参数直接暴露在url中,所以不能用来传 ...

  2. Dcoker中启动mysql,并实现root远程访问

    mysql容器的运行 下载mysql 5.7.19的镜像 docker pull mysql:5.7.19 运行mysql容器,端口映射为 10036 docker run --name mysql5 ...

  3. 浅谈C++/JAVA/C#运行机制和执行效率

    估计有很多同学都对C++/JAVA/C#这三大热门语言的运行机制和执行效率有或多或少的困惑,自己也有,但是经过前期的学习,了解了三者在这两方面的区别,就废话不说了,进入主题吧.         一.运 ...

  4. 《Linux内核设计与实现》第7章读书笔记

    第七章 链接 一. 链接的概念 链接是将各种代码和数据部分收集起来并组合成为一个单一文件的过程.可以执行于编译.加载和运行时,由叫做链接器(可实现分离编译)的程序自动执行. 二.静态链接 为了创建静态 ...

  5. 20165218 《网络对抗技术》Exp2 后门原理与实践

    Exp2 后门原理与实践 准备工作 1. 查看Linux和Win的IP地址,ping通 Linux地址 Win7地址 ping 2.下载ncat并装载到win7主机 3.下载socat并装载到win7 ...

  6. (转)log4j(六)——log4j.properties试过过程详解

    一:测试环境与log4j(一)——为什么要使用log4j?一样,这里不再重述 参考:https://www.cnblogs.com/ywlaker/p/6124067.html log4j基本用法 首 ...

  7. servlet与tomcat的关系

    1.4   Tomcat简介 学习Servlet技术,首先需要有一个Servlet运行环境,也就是需要有一个Servlet容器,本书采用的是Tomcat. Tomcat是一个免费的开放源代码的Serv ...

  8. Azure 上SQL Database(PaaS)Time Zone时区问题处理(进阶篇)

    通常ISV在面对本地客户时对时间相关的处理,一般都时区信息都是不敏感的.但是现在云的世界里为了让大家把时间处理的方式统一起来,云上的服务都是以UTC时间为准的,现在如果作为一个ISV来说就算你面对的客 ...

  9. Redis 创建多个端口 链接redis端口

    默认的是6379 可以用6380,6381开启多个 1.开启 ./redis-server ../etc/redis.6380.conf & 2.链接 redis-cli -p 6380 查看 ...

  10. Docker入门与应用系列(一)介绍和部署

    Docker介绍 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化.容器是完全使用沙箱机制, ...