zoukankan      html  css  js  c++  java
  • 解题:BJOI 2006 狼抓兔子

    题面

    可以看出来是最小割,然后你就去求最大流了

    这么大的范围就是让你用网络流卡的?咋想的啊=。=???

    建议还是老老实实用 平面图最小割等于其对偶图最短路 这个东西来做吧,虽然这个东西跑的也挺慢的,最后一个点跑了$2s$

    对偶图就是被边分割出来的每个区域当成一个点,然后两个区域有公共边就连边,起点和终点的问题就在源汇点中间连一条边然后就能分出来了

     1 #include<queue>
     2 #include<cstdio>
     3 #include<cctype> 
     4 #include<cstring>
     5 #include<algorithm>
     6 using namespace std;
     7 const int N=2000005,M=6000005;
     8 struct a{int node,dist;};
     9 bool operator < (a x,a y)
    10 {
    11     return x.dist>y.dist;
    12 }
    13 priority_queue<a> hp;
    14 int p[N],noww[2*M],goal[2*M],val[2*M],dis[N],vis[N];
    15 int n,m,rd,st,ed,bs,t1,t2,cnt;
    16 void Read(int &x)
    17 {
    18     x=0; char ch=getchar();
    19     while(!isdigit(ch))
    20         ch=getchar();
    21     while(isdigit(ch))
    22         x=(x<<3)+(x<<1)+(ch^48),ch=getchar();
    23 }
    24 void Link(int f,int t,int v) 
    25 {
    26     noww[++cnt]=p[f],p[f]=cnt;
    27     goal[cnt]=t,val[cnt]=v;
    28 }
    29 int ID(int a,int b,int c)
    30 {
    31     if(a>n||!b) return st;
    32     if(!a||b>m) return ed;
    33     return (a-1)*m+b+c*n*m;
    34 }
    35 void Dijkstra()
    36 {
    37     memset(dis,0x3f,sizeof dis);
    38     dis[st]=0,hp.push((a){st,0});
    39     while(!hp.empty())
    40     {
    41         a tt=hp.top(); hp.pop(); int tn=tt.node;
    42         if(vis[tn]) continue; vis[tn]=true;
    43         for(int i=p[tn];i;i=noww[i])
    44             if(dis[goal[i]]>dis[tn]+val[i])
    45             {
    46                 dis[goal[i]]=dis[tn]+val[i];
    47                 hp.push((a){goal[i],dis[goal[i]]});
    48             }
    49     }
    50 }
    51 int main()
    52 {
    53     register int i,j;
    54     Read(n),Read(m);
    55     n--,m--,st=2*n*m+1,ed=st+1;
    56     for(i=1;i<=n+1;i++)
    57         for(j=1;j<=m;j++)
    58         {
    59             Read(rd),t1=ID(i,j,1),t2=ID(i-1,j,0);
    60             Link(t1,t2,rd),Link(t2,t1,rd);
    61         }
    62     for(i=1;i<=n;i++)
    63         for(j=1;j<=m+1;j++)
    64         {
    65             Read(rd),t1=ID(i,j,0),t2=ID(i,j-1,1);
    66             Link(t1,t2,rd),Link(t2,t1,rd);
    67         }
    68     for(i=1;i<=n;i++)
    69         for(j=1;j<=m;j++)
    70         {
    71             Read(rd),t1=ID(i,j,0),t2=ID(i,j,1);
    72             Link(t1,t2,rd),Link(t2,t1,rd);
    73         }
    74     Dijkstra(); printf("%d",dis[ed]);
    75     return 0;
    76 }
    View Code
  • 相关阅读:
    [Docker] Windows 宿主环境下,共享或上传文件到容器的方法
    [Docker]
    [Docker]
    [Docker]
    [Windows]
    [Linux] 树莓派 4B 安装 Ubuntu 19.10 (Eoan Ermine) IOT 版
    [Linux]
    [.Net] 什么是线程安全的并发集合
    [IOT]
    c++库大全
  • 原文地址:https://www.cnblogs.com/ydnhaha/p/10148496.html
Copyright © 2011-2022 走看看