小m在mc裡開闢了兩塊巨大的耕地a和b(你可以認為容量是無窮),現在,小p有n中作物的種子,每種作物的種子有1個(就是可以種一棵作物)(用1...n編號)。
現在,第i種作物種植在a中種植可以獲得ai的收益,在b中種植可以獲得bi的收益,而且,現在還有這麼一種神奇的現象,就是某些作物共同種在一塊耕地中可以獲得額外的收益,小m找到了規則中共有m種作物組合,第i個組合中的作物共同種在a中可以獲得c1i的額外收益,共同總在b中可以獲得c2i的額外收益。
小m很快的算出了種植的最大收益,但是他想要考考你,你能回答他這個問題麼?
輸入格式:
第一行包括乙個整數n
第二行包括n個整數,表示ai第三行包括n個整數,表示bi第四行包括乙個整數m接下來m行,
對於接下來的第i行:第乙個整數ki,表示第i個作物組合中共有ki種作物,
接下來兩個整數c1i,c2i,接下來ki個整數,表示該組合中的作物編號。
輸出格式:
只有一行,包括乙個整數,表示最大收益
輸入樣例#1: 複製
3輸出樣例#1: 複製4 2 1
2 3 2
12 3 2 1 2
11樣例解釋
a耕地種1,2,b耕地種3,收益4+2+3+2=11。
資料範圍與約定
1<=k< n<= 1000,0 < m < = 1000 保證所有資料及結果不超過2*10^9。
非常好的網路流題 和善意的謊言有一點類似
這種二選一的一般將兩種選擇轉化為源點 和 匯點 然後求一下最小割就肯定是二選一了
比較難處理的是組合優惠
可以如下建圖:
黃邊c1 c2 藍邊為inf(不可減) 就完美的解決了
#includeusingview codenamespace
std;
//input by bxd
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define repp(i,a,b) for(int i=(a);i>=(b);--i)
#define ri(n) scanf("%d",&(n))
#define rii(n,m) scanf("%d%d",&n,&m)
#define riii(n,m,k) scanf("%d%d%d",&n,&m,&k)
#define rs(s) scanf("%s",s);
#define ll long long
#define pb push_back
#define rep(i,n) for(int i=0;i
#define clr(a,v) memset(a,v,sizeof a)
/////////////////////////////////
/#define inf 0x3f3f3f3f
const
int n=4e5+44
;const
int m=4e6+54
;struct
edge e[m
<< 1
];int head[n], cnt = 1
;void add(int x, int y, int
z) ;
head[x] =cnt;
e[++cnt] = (edge);
head[y] =cnt;
}int
level[n];
bool bfs(int s, int
t) }
return
level[t];
}int dfs(int s, int t, int
flow)
}if (!ret) level[s] = 0
;
return
ret;
}int dinic(int s, int
t) int
n,m,s,t,t,a,b,c1,x,k,c2,sum;
intmain()
rep(i,
1,n)
ri(m);
rep(i,
1,m)
}cout
return0;
}
最小割 P1361 小M的作物
p1361 小m的作物 建圖好題。思路 看得出來還是經典的兩者取一模型,也就是找出一種割邊方式,將點劃分為兩個集合,且割邊花費最小。但是給出的是收益而非費用,怎麼辦呢?最大收益 總收益 最小損失。總收益就是把題目給出的種a地種b地的收益以及組合的bonus全部加起來。最小損失就是跑最大流 最小割 將...
P1361 小M的作物 網路流 最小割
小m在mc裡開闢了兩塊巨大的耕地a和b 你可以認為容量是無窮 現在,小p有n中作物的種子,每種作物的種子有1個 就是可以種一棵作物 用1.n編號 現在,第i種作物種植在a中種植可以獲得ai的收益,在b中種植可以獲得bi的收益,而且,現在還有這麼一種神奇的現象,就是某些作物共同種在一塊耕地中可以獲得額...
P1361 小M的作物
p1361 小m的作物 二者取其一型別的網路流題 不同的集合,向對應元素連去不同 收益 容量的邊 對於那些神奇的組合,我們只需要按照以下方式建立兩個點 x 向 s 連一條在a時的額外收益 2.x x 注意順序,x 是其有向邊的起點,x 是其有向邊的終點 向其後繼節點連 inf 容量的邊,保證不會出現...