B1391 [Ceoi2008]order 最大权闭合图 最小割
啊啊啊,假的题吧!!!我用的当前弧优化T了6个点,其他人不用优化AC!!!震惊!!!当前弧优化是假的吧!!!
到现在我也没调出来。。。大家帮我看看为啥70.。。。
来讲一下这个题的思路,就是设一个源点,向每一个任务建边,边权为任务价值。然后任务向机器建边,边权为租金,最后机器向汇点建边,边权为购买的费用。
但这个题题意不明确,好像租完一个机器,还要花费购买的钱。
题干:
Description 有N个工作,M种机器,每种机器你可以租或者买过来. 每个工作包括若干道工序,每道工序需要某种机器来完成,你可以通过购买或租用机器来完成。 现在给出这些参数,求最大利润 Input 第一行给出 N,M(1<=N<=1200,1<=M<=1200) 下面将有N块数据,每块数据第一行给出完成这个任务能赚到的钱(其在[1,5000])及有多少道工序 接下来若干行每行两个数,分别描述完成工序所需要的机器编号及租用它的费用(其在[1,20000]) 最后M行,每行给出购买机器的费用(其在[1,20000]) Output 最大利润 Sample Input 2 3 100 2 1 30 2 20 100 2 1 40 3 80 50 80 110 Sample Output 50 HINT Source
70分代码(欢迎大佬们指出我的错误啊)
#include<iostream> #include<cstdio> #include<cmath> #include<ctime> #include<queue> #include<algorithm> #include<cstring> using namespace std; #define duke(i,a,n) for(int i = a;i <= n;i++) #define lv(i,a,n) for(int i = a;i >= n;i--) #define clean(a) memset(a,0,sizeof(a)) const int INF = 1 << 30; typedef long long ll; typedef double db; template <class T> void read(T &x) { char c; bool op = 0; while(c = getchar(), c < '0' || c > '9') if(c == '-') op = 1; x = c - '0'; while(c = getchar(), c >= '0' && c <= '9') x = x * 10 + c - '0'; if(op) x = -x; } template <class T> void write(T x) { if(x < 0) putchar('-'), x = -x; if(x >= 10) write(x / 10); putchar('0' + x % 10); } struct node{ int x,y,w,next,other; }a[2200000]; int len = 0,last[1200000],n,m,st = 0,ed; void add(int x,int y,int w) { int k1,k2; a[++len].next = last[x]; k1 = len; a[len].x = x; a[len].y = y; a[len].w = w; last[x] = len; a[++len].next = last[y]; k2 = len; a[len].x = y; a[len].y = x; a[len].w = 0; last[y] = len; a[k1].other = k2; a[k2].other = k1; } int qu[1000005],h[1000005],ans = 0; int cur[1000005]; bool bfs() { clean(h); int head = 1,tail = 2; qu[head] = st; h[st] = 1; while(head != tail) { int x = qu[head]; // cout<<x<<endl; for(int k = last[x];k;k = a[k].next) { int y = a[k].y; if(h[y] == 0 && a[k].w > 0) { h[y] = h[x] + 1; qu[tail++] = y; } } head++; } if(h[ed] > 0) return true; else return false; } int dfs(int x,int f) { if(x == ed) return f; int s = 0,t; for(int k = cur[x];k;k = a[k].next,cur[x] = k) { int y = a[k].y; if(s < f && h[y] == (h[x] + 1) && a[k].w > 0) { t = dfs(y,min(a[k].w,f - s)); s += t; a[k].w -= t; a[a[k].other].w += t; } } if(s == 0) h[x] = 0; return s; } int main() { read(n);read(m); ed = n + m + 1; int p,q,e,r; duke(i,1,n) { read(p); ans += p; add(st,i,p); read(q); duke(j,1,q) { read(e);read(r); add(i,e + n,r); } } duke(i,1,m) { read(r); add(n + i,ed,r); } while(bfs()) { duke(i,0,n + m + 1) cur[i] = last[i]; ans -= dfs(0,INF); // cout<<ans<<endl; } write(ans); return 0; } /* 2 3 100 2 1 30 2 20 100 2 1 40 3 80 50 80 110 */
只想找一个不会伤害我的人