网络流裸题:

分两部分建图,求不要求满流的最大费用最大流.....

Yu-Gi-Oh!

Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)

Total Submission(s): 401    Accepted Submission(s): 108

Problem Description
"Yu-Gi-Oh!", also known as "Dueling Monsters", is a popular trading card game which has nearly 20 years history. Next year, YGO will reach its 20th birthday.



Stilwell has n monsters
on the desk, each monster has its leveli and ATKi.
There are two kinds of monsters, Tuner monsters and Non-Tuner monsters.



Now, Stilwell plans to finish some "Synchro Summon", and "Synchro Summon" is a kind of special summon following these rules (a little different from the standard YGO rules):



(1) A "Synchro Summon" needs two monsters as the material of this summon, and they must be one Tuner monster and one Non-Tuner monster.

In other words, we can cost one Tuner monster and one Non-Tuner monster to get a Synchro monster ("cost" means remove form the desk, "get" means put on to the desk).



(2) To simplify this problem, Synchro monsters are neither Tuner monsters nor Non-Tuner monsters.



(3) The level sum of two material must be equal to the level of Synchro monster we summon.

For example:

A Level 3 Tuner monster + A
Level 2 Non-Tuner monster = A
Level 5 Synchro Monster

A Level 2 Tuner monster + A
Level 4 Non-Tuner monster = A
Level 6 Synchro Monster

A Level 4 Tuner monster + A
Level 4 Non-Tuner monster = A
Level 8 Synchro Monster



(4) The material of some Synchro monster has some limits, the material must contain some specific monster.

For example:

A Level 5 Synchro Monster α requires
A Level 3 Tuner monster α to
be its material

A Level 6 Synchro Monster β requires
A Level 4 Non-Tuner monster β to
be its material

A Level 8 Synchro Monster γ requires
A Level 4 Tuner monster γ + A
Level 4 Non-Tuner monster γ to
be its material

A Level 5 Synchro Monster φ doesn't
require any monsters to be its material

Then

A Level 3 Tuner monster α + A
Level 2 Non-Tuner monster = A
Level 5 Synchro Monster α

A Level 3 Tuner monster δ + A
Level 2 Non-Tuner monster ≠ A
Level 5 Synchro Monster α

A Level 2 Tuner monster + A
Level 4 Non-Tuner monster β = A
Level 6 Synchro Monster β

A Level 3 Tuner monster + A
Level 3 Non-Tuner monster ζ ≠ A
Level 6 Synchro Monster β

A Level 4 Tuner monster γ + A
Level 4 Non-Tuner monster γ = A
Level 8 Synchro Monster γ

A Level 4 Tuner monster σ + A
Level 4 Non-Tuner monster γ ≠ A
Level 8 Synchro Monster γ

A Level 4 Tuner monster γ + A
Level 4 Non-Tuner monster ϕ ≠ A
Level 8 Synchro Monster γ

A Level 3 Tuner monster + A
Level 2 Non-Tuner monster = A
Level 5 Synchro Monster φ

A Level 3 Tuner monster α + A
Level 2 Non-Tuner monster = A
Level 5 Synchro Monster φ



Stilwell has m kinds
of Synchro Monster cards, the quantity of each Synchro Monster cards is infinity.



Now, given leveli and ATKi of
every card on desk and every kind of Synchro Monster cards. Please finish some Synchro Summons (maybe zero) to maximum ∑ATKi of
the cards on desk.
 
Input
The first line of the input contains a single number T,
the number of test cases.



For each test case, the first line contains two integers n, m.



Next n lines,
each line contains three integers tuneri, leveli,
and ATKi,
describe a monster on the desk. If this monster is a Tuner monster, then tuneri=1,
else tuneri=0 for
Non-Tuner monster.



Next m lines,
each line contains integers levelj, ATKj, rj,
and following rj integers
are the required material of this Synchro Monster (the integers given are the identifier of the required material).

The input data guarantees that the required material list is available, two Tuner monsters or two Non-Tuner monsters won't be required. If ri=2 the
level sum of two required material will be equal to the level of Synchro Monster.



T≤10, n,m≤300, 1≤leveli≤12, 0≤ATKi≤5000, 0≤ri≤2
 
Output
T lines,
find the maximum ∑ATKi after
some Synchro Summons.
 
Sample Input
5
2 2
1 3 1300
0 2 900
5 2300 1 1
8 2500 0
2 1
1 3 1300
1 2 900
5 2300 1 1
3 1
1 3 1300
0 2 900
0 2 800
5 2300 1 1
3 1
1 1 233
0 1 233
0 1 200
2 466 2 1 2
6 3
1 3 1300
0 2 900
0 5 1350
1 4 1800
0 10 4000
0 10 1237
5 2300 1 1
8 3000 0
6 2800 0
 
Sample Output
2300
2200
3200
666
11037
 
Author
SXYZ
 

/* ***********************************************
Author :CKboss
Created Time :2015年08月17日 星期一 08时42分00秒
File Name :HDOJ5383.cpp
************************************************ */ #include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <string>
#include <cmath>
#include <cstdlib>
#include <vector>
#include <queue>
#include <set>
#include <map> using namespace std; const int INF=0x3f3f3f3f;
const int maxv=400;
const int maxn=maxv*maxv; struct Edge
{
int to,next,cap,flow,cost;
}edge[maxn]; int n,m;
int Adj[maxv],Size,N; void init()
{
memset(Adj,-1,sizeof(Adj)); Size=0;
} void addedge(int u,int v,int cap,int cost)
{
edge[Size].to=v;
edge[Size].next=Adj[u];
edge[Size].cost=cost;
edge[Size].cap=cap;
edge[Size].flow=0;
Adj[u]=Size++;
} void Add_Edge(int u,int v,int cap,int cost)
{
addedge(u,v,cap,cost);
addedge(v,u,0,-cost);
} int dist[maxv];
int vis[maxv],pre[maxv]; bool spfa(int s,int t)
{
queue<int> q;
for(int i=0;i<N;i++)
{
dist[i]=-INF; vis[i]=false; pre[i]=-1;
}
dist[s]=0; vis[s]=true; q.push(s);
while(!q.empty())
{
int u=q.front();
q.pop();
vis[u]=false;
for(int i=Adj[u];~i;i=edge[i].next)
{
int v=edge[i].to;
if(edge[i].cap>edge[i].flow&&
dist[v]<dist[u]+edge[i].cost)
{
dist[v]=dist[u]+edge[i].cost;
pre[v]=i;
if(!vis[v])
{
vis[v]=true;
q.push(v);
}
}
}
}
if(pre[t]==-1) return false;
return true;
} int MinCostMaxFlow(int s,int t,int &cost)
{
int flow=0;
cost=0;
while(spfa(s,t))
{
int Min=INF;
for(int i=pre[t];~i;i=pre[edge[i^1].to])
{
if(Min>edge[i].cap-edge[i].flow)
Min=edge[i].cap-edge[i].flow;
}
if(dist[t]<0) break;
for(int i=pre[t];~i;i=pre[edge[i^1].to])
{
edge[i].flow+=Min;
edge[i^1].flow-=Min;
cost+=edge[i].cost*Min;
}
flow+=Min;
}
return flow;
} struct Moster
{
Moster(){}
Moster(int l,int a):level(l),ATK(a){}
int level,ATK;
}; vector<Moster> m0,m1;
int turn[maxv],pos[maxv];
int GG[maxv][maxv]; int main()
{
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout); int T_T;
scanf("%d",&T_T);
while(T_T--)
{
scanf("%d%d",&n,&m);
init(); m0.clear(); m1.clear();
memset(GG,0,sizeof(GG));
int sumATK=0;
int sz1=0,sz2=0;
for(int i=0,t,l,a;i<n;i++)
{
scanf("%d%d%d",&t,&l,&a);
if(t==0)
{
m0.push_back(Moster(l,a));
turn[i]=0; pos[i]=sz1++;
}
else if(t==1)
{
m1.push_back(Moster(l,a));
turn[i]=1; pos[i]=sz2++;
}
sumATK+=a;
}
for(int i=0,l,a,r;i<m;i++)
{
scanf("%d%d%d",&l,&a,&r);
if(r==0)
{
for(int j=0;j<sz1;j++)
{
for(int k=0;k<sz2;k++)
{
int u=j+1,v=k+sz1+1;
if(m0[j].level+m1[k].level==l)
{
if(a>m0[j].ATK+m1[k].ATK)
{
GG[u][v]=max(GG[u][v],a-m0[j].ATK-m1[k].ATK);
}
}
}
}
}
else if(r==1)
{
int x;
scanf("%d",&x); x--;
if(turn[x]==0)
{
int P=pos[x];
for(int j=0;j<sz2;j++)
{
int u=P+1,v=j+sz1+1;
if(m0[P].level+m1[j].level==l)
{
if(a>m0[P].ATK+m1[j].ATK)
{
GG[u][v]=max(GG[u][v],a-m0[P].ATK-m1[j].ATK);
}
}
}
}
else if(turn[x]==1)
{
int P=pos[x];
for(int j=0;j<sz1;j++)
{
int u=j+1,v=P+sz1+1;
if(m0[j].level+m1[P].level==l)
{
if(a>m0[j].ATK+m1[P].ATK)
{
GG[u][v]=max(GG[u][v],a-m0[j].ATK-m1[P].ATK);
}
}
}
}
}
else if(r==2)
{
int x,y;
scanf("%d%d",&x,&y); x--; y--;
if(turn[x]==1) swap(x,y);
int u=pos[x]+1,v=sz1+pos[y]+1;
if(a>m0[pos[x]].ATK+m1[pos[y]].ATK)
{
GG[u][v]=max(GG[u][v],a-m0[pos[x]].ATK-m1[pos[y]].ATK);
}
}
} for(int i=1;i<=sz1;i++)
{
for(int j=sz1+1;j<=sz1+sz2;j++)
{
if(GG[i][j]>0) Add_Edge(i,j,1,GG[i][j]);
}
} int S=0,T=sz1+sz2+1;
for(int i=1;i<=sz1;i++) Add_Edge(0,i,1,0);
for(int i=sz1+1;i<=sz1+sz2;i++) Add_Edge(i,T,1,0); int flow,cost; N=sz1+sz2+2;
flow=MinCostMaxFlow(S,T,cost);
printf("%d\n",sumATK+cost);
} return 0;
}

HDOJ 5383 Yu-Gi-Oh! 最大费用最大流的更多相关文章

  1. hdoj 1533 Going Home 【最小费用最大流】【KM入门题】

    Going Home Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Tota ...

  2. Matrix Again(最大费用最大流)

    Matrix Again Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 102400/102400 K (Java/Others) Tota ...

  3. HDU3376 最小费用最大流 模板2

    Matrix Again Time Limit: 5000/2000 MS (Java/Others)    Memory Limit: 102400/102400 K (Java/Others)To ...

  4. [板子]最小费用最大流(Dijkstra增广)

    最小费用最大流板子,没有压行.利用重标号让边权非负,用Dijkstra进行增广,在理论和实际上都比SPFA增广快得多.教程略去.转载请随意. #include <cstdio> #incl ...

  5. bzoj1927最小费用最大流

    其实本来打算做最小费用最大流的题目前先来点模板题的,,,结果看到这道题二话不说(之前打太多了)敲了一个dinic,快写完了发现不对 我当时就这表情→   =_=你TM逗我 刚要删突然感觉dinic的模 ...

  6. 【Codeforces717G】Underfail Hash + 最大费用最大流

    G. Underfail time limit per test:1 second memory limit per test:256 megabytes input:standard input o ...

  7. ACM/ICPC 之 卡卡的矩阵旅行-最小费用最大流(可做模板)(POJ3422)

    将每个点拆分成原点A与伪点B,A->B有两条单向路(邻接表实现时需要建立一条反向的空边,并保证环路费用和为0),一条残留容量为1,费用为本身的负值(便于计算最短路),另一条残留容量+∞,费用为0 ...

  8. HDU5900 QSC and Master(区间DP + 最小费用最大流)

    题目 Source http://acm.hdu.edu.cn/showproblem.php?pid=5900 Description Every school has some legends, ...

  9. P3381 【模板】最小费用最大流

    P3381 [模板]最小费用最大流 题目描述 如题,给出一个网络图,以及其源点和汇点,每条边已知其最大流量和单位流量费用,求出其网络最大流和在最大流情况下的最小费用. 输入输出格式 输入格式: 第一行 ...

随机推荐

  1. 字符集编码---3 Windows BOM

    Windows平台下存储Unicode格式的文件时,会在文件头插入2到3字节的文件头.这个文件头就是BOM(Byte Order Marks). 这个文件头在Unicode中,无对应符号.所以不必担心 ...

  2. 编写Java脚本统计工程代码总行数

    在新公司工作将近一年了,一直独自一人负责服务端集群的运维和代码的编写.不知不觉从一个Project发展到了七八个Project. 看着越来越多的代码,今天突然想统计一下一共写了多少代码.[这里只统计完 ...

  3. 梦想CAD控件安卓图层

    新建图层 CAD中我们设置好图层后除了我们平常的绘图时选择线段的颜色,线型,线宽等作用,而且我们还可以在出图时选择性显示图形,冻结图形,已达到我们想要的效果. 实现代码说明: //增加一个图层 参数为 ...

  4. Pytorch 加载保存模型【直播】2019 年县域农业大脑AI挑战赛---(三)保存结果

    在模型训练结束,结束后,通常是一个分割模型,输入 1024x1024 输出 4x1024x1024. 一种方法就是将整个图切块,然后每张预测,但是有个不好处就是可能在边界处断续. 由于这种切块再预测很 ...

  5. Iframe用法精析

    String.prototype.match()中正则表达式的g标识存在的时候,函数不会捕获子表达式中的内容,不存在的时候可以. RegExp.prototype.exec()中g的存在只会影响,Re ...

  6. Django-前后台的数据交互

    Django 从后台往前台传递数据时有多种方法可以实现. 最简单的后台是这样的: from django.shortcuts import render def main_page(request): ...

  7. 【Codeforces 493C】Vasya and Basketball

    [链接] 我是链接,点我呀:) [题意] 题意 [题解] 枚举三分线(离散后)的位置 然后根据预处理的前缀和,快速算出两个队伍的分数. [代码] #include <bits/stdc++.h& ...

  8. linux下git+github个人使用记录

    Linux: 安装git的命令: sudo apt install git 查看版本确认安装成功: git --version 生成密钥: ssh-keygen -t rsa -C "you ...

  9. Java Web学习总结(32)——Java程序员最亲睐的Web框架

    这一次,我们要讨论的是web框架. 只有少数几种语言像Java一样提供了各种各样的web框架,上面的统计图就是一个证据.下面是其他开发者所使用web框架列表: spring MVC/Spring Bo ...

  10. JavaSE 学习笔记之IO流(二十二)

    IO流:用于处理设备上数据. 流:可以理解数据的流动,就是一个数据流.IO流最终要以对象来体现,对象都存在IO包中. 流也进行分类: 1:输入流(读)和输出流(写). 2:因为处理的数据不同,分为字节 ...