• 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

     

  • 相关阅读:
    数据结构 1
    MyBatis 7
    MyBatis 6
    MyBatis 5
    MaBatis 4
    MyBatis 3
    目录和文件管理
    Linux常用命令精讲
    Sentos7.4安装说明
    RIP
  • 原文地址:https://www.cnblogs.com/Achenchen/p/8459831.html
Copyright © 2020-2023  润新知