调了大半个钟居然是len没有初始化。。。
好好的恶补了一下最大权闭合子图呢。。构图大概是这样的:
然而中间寿司连方案的话边数可以到n^3的,这样会很龟
所以可以用一个小trick,对于l,r,假如l+1,r和l,r-1都OK,也就OK了,所以这两个点向l,r连边,这样就降到n^2了
#include#include #include #include #include #include using namespace std;const int inf=(1<<30)-1;struct node{ int x,y,c,next;}a[210000];int len,last[11000];void ins(int x,int y,int c){ len++; a[len].x=x;a[len].y=y;a[len].c=c; a[len].next=last[x];last[x]=len; len++; a[len].x=y;a[len].y=x;a[len].c=0; a[len].next=last[y];last[y]=len;}int h[11000],st,ed;int list[11000];bool bt_h(){ memset(h,0,sizeof(h));h[st]=1; int head=1,tail=2;list[1]=st; while(head!=tail) { int x=list[head]; for(int k=last[x];k;k=a[k].next) { int y=a[k].y; if(a[k].c>0&&h[y]==0) { h[y]=h[x]+1; list[tail++]=y; } } head++; } return h[ed]!=0;}int findflow(int x,int f){ if(x==ed)return f; int s=0; for(int k=last[x];k;k=a[k].next) { int y=a[k].y; if(a[k].c>0&&h[y]==h[x]+1&&s =0)ins(mid[i][j],ed,mp[i][j]),sum+=mp[i][j]; else ins(st,mid[i][j],-mp[i][j]); } //......composition............ int ans=0; while(bt_h()) { ans+=findflow(st,inf); } printf("%d\n",sum-ans); return 0;}