题目:http://poj.org/problem?id=2584

以人和衣服作为点,建立超级源点和超级汇点,人连边权为1的边,衣服对源点连边权为件数的边(别弄乱顺序);

试图写构造函数,但CE了,最后只好用冗杂的写法。

代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
queue<int>q;
int n,head[],ct=,d[],cur[],INF=1e9,s,t;
char dc[];
struct N{
int to,next,w;
}edge[];
//struct N{
// int next,to,w;
// N(int a=0,int b=0,int c=0):next(a),to(b),w(c) {}
//}edge[255];
int ex(char cc)
{
if(cc=='S')return ;
if(cc=='M')return ;
if(cc=='L')return ;
if(cc=='X')return ;
if(cc=='T')return ;
}
void ad(int x,int y,int z)
{
// edge[++ct]=(N){y,head[x],z};head[x]=ct;
// edge[++ct]=(N){x,head[y],0};head[y]=ct;
edge[++ct].to=y;
edge[ct].next=head[x];
edge[ct].w=z;
head[x]=ct;
edge[++ct].to=x;
edge[ct].next=head[y];
edge[ct].w=;
head[y]=ct;
// edge[++ct]=N{y,head[x],z};head[x]=ct;
// edge[++ct]=N{x,head[y],0};head[y]=ct;
}
void add(int p,char c[])
{
int x=n+ex(c[]);
int y=n+ex(c[]);
for(int i=x;i<=y;i++)ad(i,p,);
}
bool bfs()
{
memset(d,,sizeof d);
while(q.size())q.pop();
q.push();d[]=;
while(q.size())
{
int x=q.front();q.pop();
for(int i=head[x];i;i=edge[i].next)
{
int u=edge[i].to;
if(!d[u]&&edge[i].w)
{
d[u]=d[x]+;
q.push(u);
}
}
}
return d[t];
}
int dfs(int x,int f)
{
if(x==t)return f;
int res=;
for(int i=cur[x];i;i=edge[i].next)
{
int u=edge[i].to;
if(d[u]==d[x]+&&edge[i].w)
{
int tmp=dfs(u,min(edge[i].w,f-res));
edge[i].w-=tmp;
edge[i^].w+=tmp;
res+=tmp;
if(edge[i].w)cur[x]=i;
if(res==f)return f;
}
}
if(!res)d[x]=;//剪枝
return res;
}
bool dinic()
{
int ret=;
while(bfs())
{
for(int i=s;i<=t;i++)cur[i]=head[i];
ret+=dfs(s,INF);
}
if(ret==n)return ;
else return ;
}
int main()
{
while()
{
cin>>dc;
if(dc[]=='E')return ;
ct=;//!
memset(head,,sizeof head);
scanf("%d ",&n);
for(int i=;i<=n;i++)
{
cin>>dc;
add(i,dc);
}
for(int i=n+;i<=n+;i++)
{
int x;
scanf("%d",&x);
ad(,i,x);//0为超级源点
}
for(int i=;i<=n;i++)ad(i,n+,);//n+6为超级汇点
s=;t=n+;
cin>>dc;
if(dinic())printf("T-shirts rock!\n");
else printf("I'd rather not wear a shirt anyway...\n");
}
return ;
}

poj2584T-Shirt——网络最大流的更多相关文章

  1. P3376 【模板】网络最大流

    P3376 [模板]网络最大流 题目描述 如题,给出一个网络图,以及其源点和汇点,求出其网络最大流. 输入输出格式 输入格式: 第一行包含四个正整数N.M.S.T,分别表示点的个数.有向边的个数.源点 ...

  2. HDU 3549 网络最大流再试

    http://acm.hdu.edu.cn/showproblem.php?pid=3549 同样的网络最大流 T了好几次原因是用了cout,改成printf就A了 还有HDU oj的编译器也不支持以 ...

  3. 一般增广路方法求网络最大流(Ford-Fulkerson算法)

    /* Time:2015-6-18 接触网络流好几天了 写的第一个模版————Ford-Fulkerson算法 作用:求解网络最大流 注意:源点是0 汇点是1 如果题目输入的是1到n 请预处理减1 * ...

  4. 算法模板——Dinic网络最大流 2

    实现功能:同Dinic网络最大流 1 这个新的想法源于Dinic费用流算法... 在费用流算法里面,每次处理一条最短路,是通过spfa的过程中就记录下来,然后顺藤摸瓜处理一路 于是在这个里面我的最大流 ...

  5. 算法模板——Dinic网络最大流 1

    实现功能:同sap网络最大流 今天第一次学Dinic,感觉最大的特点就是——相当的白话,相当的容易懂,而且丝毫不影响复杂度,顶多也就是代码长个几行 主要原理就是每次用spfa以O(n)的时间复杂度预处 ...

  6. 图论算法-网络最大流【EK;Dinic】

    图论算法-网络最大流模板[EK;Dinic] EK模板 每次找出增广后残量网络中的最小残量增加流量 const int inf=1e9; int n,m,s,t; struct node{int v, ...

  7. 网络最大流算法—EK算法

    前言 EK算法是求网络最大流的最基础的算法,也是比较好理解的一种算法,利用它可以解决绝大多数最大流问题. 但是受到时间复杂度的限制,这种算法常常有TLE的风险 思想 还记得我们在介绍最大流的时候提到的 ...

  8. 洛谷 P3376 【【模板】网络最大流】

    题目描述 如题,给出一个网络图,以及其源点和汇点,求出其网络最大流. 输入 第一行包含四个正整数N.M.S.T,分别表示点的个数.有向边的个数.源点序号.汇点序号. 接下来M行每行包含三个正整数ui. ...

  9. 洛谷P3376 【模板】网络最大流

    题目描述 如题,给出一个网络图,以及其源点和汇点,求出其网络最大流. 输入输出格式 输入格式: 第一行包含四个正整数N.M.S.T,分别表示点的个数.有向边的个数.源点序号.汇点序号. 接下来M行每行 ...

  10. P2472 [SCOI2007]蜥蜴(网络最大流)

    P2472 [SCOI2007]蜥蜴 题目描述 在一个r行c列的网格地图中有一些高度不同的石柱,一些石柱上站着一些蜥蜴,你的任务是让尽量多的蜥蜴逃到边界外. 每行每列中相邻石柱的距离为1,蜥蜴的跳跃距 ...

随机推荐

  1. Redis闲谈(1):构建知识图谱

    场景:Redis面试 (图片来源于网络) 面试官: 我看到你的简历上说你熟练使用Redis,那么你讲一下Redis是干嘛用的? 小明: (心中窃喜,Redis不就是缓存吗?)Redis主要用作缓存,通 ...

  2. python 安装protobuf

    安装准备:python和protoc(编译proto到各个语言) 下载protobuf源代码(各种语言实现):https://github.com/google/protobuf  1.到Python ...

  3. MariaDB mysql 比较区别 选择

    MariaDB数据库管理系统是MySQL的一个分支 开发这个分支的原因之一是:甲骨文公司收购了MySQL后,有将MySQL闭源的潜在风险,因此社区采用分支的方式来避开这个风险. MariaDB的目的是 ...

  4. jvmtop 监控

    1 jar包 <!-- -JVMTOP监控- --> <dependency> <groupId>joda-time</groupId> <art ...

  5. 【BZOJ4276】[ONTAK2015]Bajtman i Okrągły Robin 线段树优化建图+费用流

    [BZOJ4276][ONTAK2015]Bajtman i Okrągły Robin Description 有n个强盗,其中第i个强盗会在[a[i],a[i]+1],[a[i]+1,a[i]+2 ...

  6. 九度OJ 1004:Median

    #include <stdio.h> #include <stdlib.h> #include <limits.h> #define N 1000000 int a ...

  7. 九度OJ 1051:数字阶梯求和 (大数运算)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:6718 解决:2280 题目描述: 给定a和n,计算a+aa+aaa+a...a(n个a)的和. 输入: 测试数据有多组,输入a,n(1&l ...

  8. mongo 数据库提前关闭 避免读写任务没有结束,异步任务没有完成,同步指令提前关闭数据库:'MongoError: server instance pool was destroyed'

    mongo 数据库提前关闭 // mongodb - npm https://www.npmjs.com/package/mongodb const mongoCfg = { uri: 'mongod ...

  9. .net 开源框架--转载

    Json.NET http://json.codeplex.com/ Json.Net 是一个读写Json效率比较高的.Net框架.Json.Net 使得在.Net环境下使用Json更加简单.通过Li ...

  10. STO到底是什么?

    最近,链圈谈论最多的就是STO了,那STO到底是什么?现阶段发展得怎么样? 什么是STO STO英文全称Security Token Offering,即证券化通证发行,指在安全法律体系下受到约束的基 ...