题意有一颗技能树每个技能有一些“先修技能”必须把这些“先修技能”全部点完才能学习这个技能这个技能树是个DAG。由于是 题意有一颗技能树每个技能有一些“先修技能”必须把这
题意有一颗技能树每个技能有一些“先修技能”必须把这些“先修技能”全部点完才能学习这个技能这个技能树是个DAG。由于是
题意有一颗技能树每个技能有一些“先修技能”必须把这些“先修技能”全部点完才能学习这个技能这个技能树是个DAG。由于是个氪金游戏点某个技能需要一些花费作为rmb玩家可以把技能树的某条边去掉也就是说某个技能少了一个先修技能当然这也需要花费。还可以直接花费金钱学习某个技能而无视其先修技能。 问在初始什么技能都没有的情况下要点某个给定的技能需要多少钱
每个技能表示1个点建图 技能的某条边为图上的边容量为去掉的费用 我们可以把点拆了中间连边容量为氪这个技能的费用 建立超源S向每个技能连边表示慢慢学的费用 求最小割
#include#include#include#include#include#include#include#include#includeusing namespace std;#define For(i,n) for(int i1;i0;i--)#define Forp(x) for(int ppre[x];p;pnext[p])#define Forpiter(x) for(int iter[x];p;pnext[p]) #define Lson (x<<1)#define Rson ((x<<1)1)#define MEM(a) memset(a,0,sizeof(a));#define MEMI(a) memset(a,127,sizeof(a));#define MEMi(a) memset(a,128,sizeof(a));#define INF (2139062143)#define F (100000007)#define MAXN (200010)#define MAXM (50000010)#define eps (1e-3)long long mul(long long a,long long b){return (a*b)%F;}long long add(long long a,long long b){return (ab)%F;}long long sub(long long a,long long b){return (a-b(a-b)/F*FF)%F;}typedef long long ll;int read(){int x0,f1; char chgetchar();while(!isdigit(ch)) {if (ch-) f-1; chgetchar();}while(isdigit(ch)) { xx*10ch-0; chgetchar();}return x*f;} class Max_flow //dinic当前弧优化 { public: int n,s,t; int q[MAXN]; int edge[MAXM],next[MAXM],pre[MAXN],weight[MAXM],size; void addedge(int u,int v,int w) { edge[size]v; weight[size]w; next[size]pre[u]; pre[u]size; } void addedge2(int u,int v,int w){addedge(u,v,w),addedge(v,u,0);} bool b[MAXN]; int d[MAXN]; bool SPFA(int s,int t) { For(i,n) d[i]INF; MEM(b) d[q[1]s]0;b[s]1; int head1,tail1; while (head>T;while(T--){cin>>n>>m>>Spec;int s2*n1,t2*n2; S.mem(t,s,t);For(i,m) {int a,b,c;aread(),bread(),cread();S.addedge2(an,b,c);} For(i,n) {int aread();S.addedge2(s,i,a); }For(i,n) {int aread();S.addedge2(i,in,a); }S.addedge2(Specn,t,1000000);cout<