bzoj 3876: [Ahoi2014]支线剧情
就是加一个1的下界就好了。
1 #include<bits/stdc++.h> 2 #define N 100005 3 #define LL long long 4 #define inf 0x3f3f3f3f 5 #define ls tr[x][0] 6 #define rs tr[x][1] 7 using namespace std; 8 inline int ra() 9 { 10 int x=0,f=1; char ch=getchar(); 11 while (ch<'0' || ch>'9') {if (ch=='-') f=-1; ch=getchar();} 12 while (ch>='0' && ch<='9') {x=x*10+ch-'0'; ch=getchar();} 13 return x*f; 14 } 15 struct node{ 16 int c,v,from,to,next; 17 }e[N]; 18 int tot=1,ans,from[N],n,m,S,T,head[N],cnt,dis[N],q[N<<1]; 19 bool inq[N]; 20 void ine(int x, int y, int v, int c) 21 { 22 e[++tot].to=y; e[tot].next=head[x]; head[x]=tot; 23 e[tot].v=v; e[tot].c=c; e[tot].from=x; 24 } 25 void insert(int x, int y, int c, int v) 26 { 27 ine(x,y,v,c); ine(y,x,-v,0); 28 } 29 bool spfa() 30 { 31 for (int i=1; i<=n+2; i++) dis[i]=inf; 32 int l=0,r=1; q[0]=S; dis[S]=0; inq[S]=1; 33 while (l<r) 34 { 35 int x=q[l++]; 36 for (int i=head[x];i;i=e[i].next) 37 if (dis[e[i].to]>dis[x]+e[i].v && e[i].c) 38 { 39 dis[e[i].to]=dis[x]+e[i].v; 40 from[e[i].to]=i; 41 if (!inq[e[i].to]) 42 { 43 inq[e[i].to]=1; 44 q[r++]=e[i].to; 45 } 46 } 47 inq[x]=0; 48 } 49 if (dis[T]==inf) return 0; 50 return 1; 51 } 52 void mcf() 53 { 54 int x=inf; 55 for (int i=from[T];i;i=from[e[i].from]) x=min(x,e[i].c); 56 for (int i=from[T];i;i=from[e[i].from]) ans+=x*e[i].v,e[i].c-=x,e[i^1].c+=x; 57 } 58 void fyl() 59 { 60 while (spfa()) mcf(); 61 } 62 int main() 63 { 64 n=ra(); 65 S=n+1; T=n+2; 66 for (int i=1; i<=n; i++) 67 { 68 int cnt=ra(); 69 insert(i,T,cnt,0); 70 if (i!=1) insert(i,1,inf,0); 71 for (int j=1; j<=cnt; j++) 72 { 73 int x=ra(),v=ra(); 74 insert(S,x,1,v); 75 insert(i,x,inf,v); 76 } 77 } 78 fyl(); 79 cout<<ans; 80 return 0; 81 }