bzoj 3158: 千钧一发

Posted xiyuedong

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了bzoj 3158: 千钧一发相关的知识,希望对你有一定的参考价值。

  1 #include<cstdio>
  2 #include<iostream>
  3 #include<cstring>
  4 #include<cmath>
  5 #include<algorithm>
  6 #define M 200009
  7 #define inf 2139062143
  8 using namespace std;
  9 int cnt=1,n,m,S,T,d[M],q[2*M],f[M],head[M],next[10*M],u[10*M],v[10*M],a[M];
 10 int ans,sum;
 11 bool bfs()
 12 {
 13     memset(d,0,sizeof(d));
 14     int h=0,t=1;
 15     q[1]=S;
 16     d[S]=1;
 17     for(;h<t;)
 18       {
 19         h++;
 20         int p=q[h];
 21         for(int i=head[p];i;i=next[i])
 22           if(!d[u[i]]&&v[i])
 23             {
 24                 d[u[i]]=d[p]+1;
 25                 if(d[T])
 26                   return 1;
 27                 t++;
 28                 q[t]=u[i];
 29             }
 30       }
 31     return 0;
 32 }
 33 int dinic(int s,int f)
 34 {
 35     if(s==T)
 36       return f;
 37     int rest=f;
 38     for(int i=head[s];i&&rest;i=next[i])
 39       if(v[i]&&d[u[i]]==d[s]+1)
 40         {
 41             int now=dinic(u[i],min(rest,v[i]));
 42             if(!now)
 43               d[u[i]]=0;
 44             v[i]-=now;
 45             v[i^1]+=now;
 46             rest-=now;
 47         }
 48     return f-rest;  
 49 }
 50 void jia1(int a1,int a2,int a3)
 51 {
 52     cnt++;
 53     next[cnt]=head[a1];
 54     head[a1]=cnt;
 55     u[cnt]=a2;
 56     v[cnt]=a3;
 57     return;
 58 }
 59 void jia(int a1,int a2,int a3)
 60 {
 61     jia1(a1,a2,a3);
 62     jia1(a2,a1,0);
 63     return;
 64 }
 65 int gcd(int a1,int a2)
 66 {
 67     int a3=a1%a2;
 68     for(;a3;)
 69       {
 70         a1=a2;
 71         a2=a3;
 72         a3=a1%a2;
 73       }
 74     return a2;
 75 }
 76 bool jud(long long a1,long long a2)
 77 {
 78     long long a3=a1*a1+a2*a2,a4=sqrt(a3);
 79     if(a4*a4!=a3)
 80       return 0;
 81     if(gcd(a1,a2)>1)
 82       return 0;
 83     return 1;
 84 }
 85 int main()
 86 {
 87     scanf("%d",&n);
 88     T=2*n+1;
 89     S=0;
 90     for(int i=1;i<=n;i++)
 91       scanf("%d",&a[i]);
 92     for(int i=1;i<=n;i++)
 93       {
 94         int b1;
 95         scanf("%d",&b1);
 96         sum+=b1;
 97         jia(S,i,b1);
 98         jia(i+n,T,b1);
 99       }
100     for(int i=1;i<=n;i++)
101       for(int j=i+1;j<=n;j++)
102         {
103             if(jud(a[i],a[j]))
104               {
105                 jia(i,j+n,inf);
106                 jia(j,i+n,inf);
107               }
108         }
109     for(;bfs();)
110       ans+=dinic(S,0x7fffffff);
111     printf("%d\n",sum-(ans>>1));
112     return 0;
113 }

网络流同连连看。

以上是关于bzoj 3158: 千钧一发的主要内容,如果未能解决你的问题,请参考以下文章

bzoj 3158 千钧一发——网络流

bzoj3158 千钧一发

bzoj3158: 千钧一发(最小割)

bzoj3158千钧一发 最小割

bzoj3275: Number(最小割)

BZOJ 2244: [SDOI2011]拦截导弹 DP+CDQ分治