bzoj2229: [Zjoi2011]最小割

传送门

日常读错题。无向图看成有向图,De了一下午bug。。。

  1 //Achen
  2 #include<algorithm>
  3 #include<iostream>
  4 #include<cstring>
  5 #include<cstdlib>
  6 #include<vector>
  7 #include<cstdio>
  8 #include<queue>
  9 #include<cmath>
 10 const int N=157,inf=0x7fffffff;
 11 typedef long long LL;
 12 using namespace std;
 13 int T,n,m,a[N],b[N],dis[N][N];
 14 
 15 template<typename T>void read(T &x)  {
 16     char ch=getchar(); x=0; T f=1;
 17     while(ch!='-'&&(ch<'0'||ch>'9')) ch=getchar();
 18     if(ch=='-') f=-1,ch=getchar();
 19     for(;ch>='0'&&ch<='9';ch=getchar()) x=x*10+ch-'0'; x*=f;
 20 }
 21 
 22 struct edge {
 23     int u,v,fl,cap,nx;
 24     edge(){}
 25     edge(int u,int v,int fl,int cap,int nx):u(u),v(v),fl(fl),cap(cap),nx(nx){} 
 26 }e[N*N]; 
 27 
 28 int fir[N],cur[N],ecnt,p[N];
 29 void add(int u,int v,int cap) {
 30     e[++ecnt]=edge(u,v,0,cap,fir[u]); fir[u]=ecnt;
 31     e[++ecnt]=edge(v,u,0,0,fir[v]); fir[v]=ecnt;
 32 }
 33 
 34 int calc(int s,int t) {
 35     int fl=inf;
 36     for(int i=t;i!=s;i=e[p[i]].u) 
 37         fl=min(fl,e[p[i]].cap-e[p[i]].fl);
 38     for(int i=t;i!=s;i=e[p[i]].u) 
 39         e[p[i]].fl+=fl,e[p[i]^1].fl-=fl;
 40     return fl;
 41 } 
 42 
 43 int d[N],c[N];
 44 queue<int>que;
 45 int bfs(int s,int t) {
 46     que.push(t);
 47     d[t]=0;
 48     while(!que.empty()) {
 49         int x=que.front();
 50         que.pop();
 51         for(int i=fir[x];i;i=e[i].nx) if(d[e[i].v]==n&&e[i].cap==0) {
 52             d[e[i].v]=d[x]+1;
 53             que.push(e[i].v);
 54         }
 55     }
 56 }
 57 
 58 int ISAP(int s,int t) {
 59     memset(c,0,sizeof(c));
 60     for(int i=1;i<=n;i++) d[i]=n,cur[i]=fir[i];
 61     bfs(s,t);
 62     for(int i=1;i<=n;i++) c[d[i]]++;
 63     int res=0;
 64     for(int x=s;d[x]<n;) {
 65         if(x==t) {
 66             res+=calc(s,t);
 67             x=s;
 68         }
 69         int ok=0;
 70         for(int &i=cur[x];i;i=e[i].nx) if(d[e[i].v]+1==d[x]&&e[i].cap>e[i].fl) {
 71             p[x=e[i].v]=i; ok=1; break;
 72         }
 73         if(!ok) {
 74             cur[x]=fir[x]; int M=n;
 75             for(int i=fir[x];i;i=e[i].nx) if(e[i].cap>e[i].fl) 
 76                 M=min(M,d[e[i].v]+1);
 77             if(!(--c[d[x]])) break;
 78             c[d[x]=M]++;
 79             if(x!=s) x=e[p[x]].u; 
 80         }
 81     }
 82     return res;
 83 }
 84 
 85 int vis[N];
 86 void dfs(int x) {
 87     vis[x]=1;
 88     for(int i=fir[x];i;i=e[i].nx) if(!vis[e[i].v]&&e[i].fl<e[i].cap) 
 89         dfs(e[i].v);
 90 }
 91 
 92 void restore() { for(int i=2;i<=ecnt;i++) e[i].fl=0; }
 93 
 94 
 95 void solve(int l,int r) {
 96     if(l>=r) return;
 97     restore();
 98     int t=ISAP(a[l],a[r]),L=l-1,R=r+1;
 99     memset(vis,0,sizeof(vis));
100     dfs(a[l]);
101     for(int i=1;i<=n;i++) if(vis[i]) 
102         for(int j=1;j<=n;j++) if(!vis[j]) 
103             dis[i][j]=dis[j][i]=min(dis[i][j],t);
104     for(int i=l;i<=r;i++) 
105         if(vis[a[i]]) b[++L]=a[i];
106         else b[--R]=a[i];
107     for(int i=l;i<=r;i++) a[i]=b[i]; 
108     solve(l,L); solve(R,r);
109 }
110 
111 int main() {
112     read(T);
113     while(T--) {
114         ecnt=1;
115         memset(fir,0,sizeof(fir));
116         memset(dis,127/3,sizeof(dis));
117         read(n); read(m);
118         for(int i=1;i<=m;i++) {
119             int u,v,w;
120             read(u); read(v); read(w);
121             add(u,v,w);
122             add(v,u,w);
123         }
124         for(int i=1;i<=n;i++) a[i]=i;
125         solve(1,n);
126         int q,xx;
127         read(q);
128         while(q--) {
129             read(xx);
130             int ans=0;
131             for(int i=1;i<=n;i++)
132                 for(int j=i+1;j<=n;j++)
133                     if(dis[i][j]<=xx) ans++; 
134             printf("%d
",ans);
135         }
136         puts(""); 
137     }
138     return 0;
139 }
140 /*
141 1
142 5 0
143 1
144 0
145 */
View Code

 

原文地址:https://www.cnblogs.com/Achenchen/p/8459831.html