HDOJ 5383 Yu-Gi-Oh! 最大费用最大流
来源:互联网 发布:迅雷7精简优化版 编辑:程序博客网 时间:2024/06/06 18:44
网络流裸题:
分两部分建图,求不要求满流的最大费用最大流.....
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 hasn 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 hasm kinds of Synchro Monster cards, the quantity of each Synchro Monster cards is infinity.
Now, givenleveli 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.
Stilwell has
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 Tuner monster
A Level 4 Tuner 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
A Level 6 Synchro Monster
A Level 8 Synchro Monster
A Level 5 Synchro Monster
Then
A Level 3 Tuner monster
A Level 3 Tuner monster
A Level 2 Tuner monster
A Level 3 Tuner monster
A Level 4 Tuner monster
A Level 4 Tuner monster
A Level 4 Tuner monster
A Level 3 Tuner monster
A Level 3 Tuner monster
Stilwell has
Now, given
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 integersn , m .
Nextn 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.
Nextm 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. Ifri=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
For each test case, the first line contains two integers
Next
Next
The input data guarantees that the required material list is available, two Tuner monsters or two Non-Tuner monsters won't be required. If
Output
Sample Input
52 21 3 13000 2 9005 2300 1 18 2500 02 11 3 13001 2 9005 2300 1 13 11 3 13000 2 9000 2 8005 2300 1 13 11 1 2330 1 2330 1 2002 466 2 1 26 31 3 13000 2 9000 5 13501 4 18000 10 40000 10 12375 2300 1 18 3000 06 2800 0
Sample Output
23002200320066611037
Author
SXYZ
/* ***********************************************Author :CKbossCreated 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;}
1 0
- HDOJ 5383 Yu-Gi-Oh! 最大费用最大流
- hdoj 5383 Yu-Gi-Oh! 【最大费用最大流】
- hdu 5383 Yu-Gi-Oh!(最大费用费用流)
- HDU 5383 - Yu-Gi-Oh!(网络流’最小费用最大流)
- 【HDU】5383 Yu-Gi-Oh!【费用流】
- 【网络流】 HDOJ 5383 Yu-Gi-Oh!
- HDU 5383 Yu-Gi-Oh!(费用流)
- hdu 5383 Yu-Gi-Oh!(游戏王! + 费用流)
- HDU 5383 Yu-Gi-Oh! 过程中最小费用流
- HDU 5383 Yu-Gi-Oh!
- [HDU 5383] Yu-Gi-Oh!
- 【fzu 2252 Yu-Gi-Oh! 】
- 《游戏王》(Yu-Gi-Oh!) 启示录
- 《游戏王》(Yu-Gi-Oh!) 启示录
- FZU 2252 Yu-Gi-Oh!【思维+枚举】
- FZU 2252 Yu-Gi-Oh!(枚举+贪心)
- FZU 2252 Yu-Gi-Oh! 思维 枚举
- Fzu2252-Yu-Gi-Oh!-【枚举+贪心】
- OC关于NSFileHandle的解析
- ios开发之视频播放
- 1093
- matlab语言,实现了对高光谱遥感图像的读取并做主成分分析,将结果按贡献率大小顺序排列并显示出来
- Java安全结构“沙盒”模型4个组成部分
- HDOJ 5383 Yu-Gi-Oh! 最大费用最大流
- IPC - POSIX和System V比较
- SAP 金税接口增强 BADI
- zookeeper 大量连接断开重连原因排查
- WAS缓存问题
- That Nice Euler Circuit (好看的一笔画)
- Alamofire-Swift Networking网络库
- pycharm 4.5.3控制台乱码
- TableLayout