soj115 御坂网络

Posted Scx117

tags:

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

标程:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int N=405;
 4 const int inf=0x3f3f3f3f;
 5 typedef long long ll;
 6 int cnt=1,n,m,ans,Rx,xa[N],xb[N],yb[N],ya[N],head[N],Head[N],tot,S,T,dis[N];
 7 ll Ans;
 8 queue<int> q;
 9 bitset<N> f[N];
10 struct node{int to,next,f;}num[N*N];
11 struct Node{int d,x,y;Node(){} Node(int A,int B,int C){d=A;x=B;y=C;}}p[N*N];
12 void add(int x,int y,int w)
13 {
14   num[++cnt].to=y;num[cnt].next=head[x];num[cnt].f=w;head[x]=cnt;
15   num[++cnt].to=x;num[cnt].next=head[y];num[cnt].f=0;head[y]=cnt;
16   if (!f[x][y]) 
17     for (int i=1;i<=T;i++) if (f[i][x]&&!f[i][y]) f[i]|=f[y];
18 }
19 void init()
20 {
21    for (int i=1;i<=T;i++) f[i].reset(),f[i][i]=1;
22    for (int i=1;i<=T;i++)
23      for (int j=head[i];j;j=num[j].next)
24        if (num[j].f) f[i][num[j].to]=1;
25    for (int i=1;i<=T;i++)
26      for (int j=1;j<=T;j++) if (f[i][j]) f[i]|=f[j];
27 }
28 int bfs()
29 {
30   memset(dis,0,sizeof(dis));dis[S]=1;q.push(S);
31   while (!q.empty())
32   {
33     int now=q.front();q.pop();
34     for (int i=head[now];i;i=num[i].next)
35       if (num[i].f&&!dis[num[i].to]) dis[num[i].to]=dis[now]+1,q.push(num[i].to);
36   }
37   return dis[T];
38 }
39 int dfs(int x,int Min)
40 {
41   int tmp=Min;
42   if (x==T||!Min) return Min;
43   for (int &i=Head[x];i&&tmp;i=num[i].next)
44     if (dis[num[i].to]==dis[x]+1)
45     {
46        int t=dfs(num[i].to,min(tmp,num[i].f));
47        num[i].f-=t;num[i^1].f+=t;tmp-=t;
48     }
49   return Min-tmp;
50 }
51 int dinic()
52 {
53   if (!f[S][T]) return 0;
54   int res=0,tmp;
55   while (bfs())
56   {
57     memcpy(Head,head,sizeof(head));
58     while (tmp=dfs(S,inf)) res+=tmp;
59   }
60   init();
61   return res;
62 }
63 int get_dis(int i,int j){return (xa[i]-xb[j])*(xa[i]-xb[j])+(ya[i]-yb[j])*(ya[i]-yb[j]);}
64 bool cmp(const Node &A,const Node &B){return A.d<B.d;}
65 int main()
66 {
67   scanf("%d%d%d",&n,&m,&Rx);S=n+m+1;T=S+1;
68   for (int i=1;i<=T;i++) f[i][i]=1;
69   for (int i=1;i<=n;i++) add(S,i,1);
70   for (int i=1;i<=m;i++) add(i+n,T,1);
71   for (int i=1;i<=n;i++) scanf("%d",&xa[i]);
72   for (int i=1;i<=n;i++) scanf("%d",&ya[i]);
73   for (int i=1;i<=m;i++) scanf("%d",&xb[i]);
74   for (int i=1;i<=m;i++) scanf("%d",&yb[i]);
75   for (int i=1;i<=n;i++)
76     for (int j=1;j<=m;j++) p[++tot]=Node(get_dis(i,j),i,j);
77   p[++tot]=Node(Rx*Rx*4,0,0);
78   sort(p+1,p+tot+1,cmp);
79   for (int i=0;i<=tot&&p[i].d<=Rx*Rx*4;i++)//从0开始,有可能
80   {
81       add(p[i].x,p[i].y+n,1);
82       if (p[i].d!=p[i+1].d) ans+=dinic(),Ans=max(Ans,min((ll)max(p[i+1].d,p[i].d),Rx*Rx*4ll)*(n+m-ans));//注意取后一个半径进行运算,注意边界!
83   }
84   printf("%.4lf\n",(double)Ans*M_PI*0.25);
85   return 0;
86 }

 

以上是关于soj115 御坂网络的主要内容,如果未能解决你的问题,请参考以下文章

SOJ3266 Birthday

SOJ 1002/1003/1004 大整数相加/相乘/相除

Soj题目分类

最大子矩阵(SOJ 3329)

sql 旧版SOJ SQL语句

[SOJ] Ordering Tasks