zoukankan      html  css  js  c++  java
  • bzoj1001/luogu4001 狼抓兔子 (最小割/平面图最小割转对偶图最短路)

    平面图转对偶图:先在原图中加一个s->t的边,然后对每个面建一个点,对每条分隔两个面的边加一条连接这两个面对应点的边,边权等于原边权。

    然后从刚才加的s->t分割出来的两面对应的两个点跑最短路,求出来的就是s到t的最小割。

    要特判n==0||m==0的情况

    然后我特判的那个点就T了一万次,在抄elijahqi巨佬的代码的时候才发现:

    我是这样写的:

    ...
    #define MIN(x,y) (x<y?x:y)
    ...
    
    ....ans=MIN(ans,read())
    ....

    这能不T就有鬼了吧

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<algorithm>
     4 #include<vector>
     5 #include<queue>
     6 #include<map>
     7 #include<cmath>
     8 #include<ctime>
     9 #include<set>
    10 #define pa pair<int,int>
    11 #define lowb(x) ((x)&(-(x)))
    12 #define REP(i,n0,n) for(i=n0;i<=n;i++)
    13 #define PER(i,n0,n) for(i=n;i>=n0;i--)
    14 #define MAX(a,b) ((a>b)?a:b)
    15 #define MIN(a,b) ((a<b)?a:b)
    16 #define CLR(a,x) memset(a,x,sizeof(a))
    17 #define rei register int
    18 using namespace std;
    19 const int maxn=1010;
    20 typedef long long ll;
    21 
    22 ll rd(){
    23     ll x=0;char c=getchar();int neg=1;
    24     while(c<'0'||c>'9'){if(c=='-') neg=-1;c=getchar();}
    25     while(c>='0'&&c<='9') x=x*10+c-'0',c=getchar();
    26     return x*neg;
    27 }
    28 
    29 struct Edge{
    30     int a,b,l,ne;
    31 }eg[maxn*maxn*12];
    32 int N,M,egh[maxn*maxn*2],ect;
    33 int id[maxn][maxn][2],pct;
    34 int dis[maxn*maxn*2];bool flag[maxn*maxn*2];
    35 priority_queue<pa,vector<pa>,greater<pa> > q;
    36 
    37 inline void adeg(int a,int b,int l){
    38     eg[ect].a=a;eg[ect].b=b;eg[ect].l=l;
    39     eg[ect].ne=egh[a];egh[a]=ect++;
    40 }
    41 inline void adeg2(int a,int b,int c){adeg(a,b,c);adeg(b,a,c);}
    42 
    43 inline int dijkstra(int S,int E){
    44     CLR(dis,127);dis[S]=0;
    45     q.push(make_pair(0,S));
    46     while(!q.empty()){
    47         int p=q.top().second;q.pop();
    48         if(p==E) break;
    49         if(flag[p]) continue;
    50         for(rei i=egh[p];i!=-1;i=eg[i].ne){
    51             rei b=eg[i].b;
    52             if(dis[b]>dis[p]+eg[i].l){
    53                 dis[b]=dis[p]+eg[i].l;
    54                 q.push(make_pair(dis[b],b));
    55             }
    56         }flag[p]=1;
    57     }return dis[E];
    58 }
    59 
    60 int main(){
    61     //freopen(".in","r",stdin);
    62     rei i,j,k;
    63     N=rd(),M=rd();
    64     
    65     if(N==1||M==1){
    66         if(N<M) swap(N,M);int ans=0x3f3f3f3f;
    67         REP(i,1,N-1) ans=min(ans,(int)rd());printf("%d
    ",ans);
    68         return 0;
    69     }
    70     CLR(egh,-1);
    71     id[0][0][0]=++pct;id[0][0][1]=++pct;
    72     REP(i,1,N-1) REP(j,1,M-1) id[i][j][0]=++pct,id[i][j][1]=++pct;
    73     REP(i,1,N){
    74         REP(j,1,M-1){
    75             if(i==1) adeg2(id[1][j][1],id[0][0][0],rd());
    76             else if(i==N) adeg2(id[N-1][j][0],id[0][0][1],rd());
    77             else adeg2(id[i-1][j][0],id[i][j][1],rd());
    78         }
    79     }
    80     REP(i,1,N-1){
    81         REP(j,1,M){
    82             if(j==1) adeg2(id[i][1][0],id[0][0][1],rd());
    83             else if(j==M) adeg2(id[i][M-1][1],id[0][0][0],rd());
    84             else adeg2(id[i][j-1][1],id[i][j][0],rd());
    85         }
    86     }
    87     REP(i,1,N-1){
    88         REP(j,1,M-1){
    89             adeg2(id[i][j][0],id[i][j][1],rd());
    90         }
    91     }
    92     printf("%d
    ",dijkstra(id[0][0][0],id[0][0][1]));
    93 
    94     return 0;
    95 }
  • 相关阅读:
    读《成交》有感
    【VC++学习笔记二】绘制图片的双缓冲技术
    【VC++学习笔记一】MFC操作Excel
    敏捷软件开发
    VIM常用命令
    Ubuntu下配置samba实现文件夹共享
    linux系统编程之管道(三):命令管道(FIFO)
    linux系统编程之管道(二):管道读写规则
    linux系统编程之管道(一):匿名管道(pipe)
    《Linux环境进程间通信》系列文章链接
  • 原文地址:https://www.cnblogs.com/Ressed/p/9603994.html
Copyright © 2011-2022 走看看