• bzoj1266最短路+最小割


    本来写了spfa

    wa了

    看到网上有人写Floyd过了

    表示不开心 ̄へ ̄

    改成Floyd试试。。。

    还是wa

    ヾ(。`Д´。)原来是建图错了(样例怎么过的)

    结果T了

    于是把Floyd改回spfa

    还是T了

    。。。

     ̄へ ̄

    看来问题不在最短路,改回Floyd(mdzz)

    。。。

    好像dinic有点问题

    ( ⊙ o ⊙ )A了

     1 #include <cstdio>  
     2 #include <cstring>  
     3 #include <iostream>  
     4 #include <algorithm>  
     5 #define M 510  
     6 #define S 1  
     7 #define T n  
     8 #define INF 1000000000 
     9 using namespace std;  
    10 struct edge{  
    11     int x,y,f,c;  
    12 }e[124800];  
    13 int n,m,ans,i,j,k,x,y,z;  
    14 int map[M][M];
    15 int head[M],tot=1;
    16 int dpt[M]; 
    17 struct abcd{  
    18     int to,next,f;  
    19 }table[124800<<2];
    20 void add(int x,int y,int z)  
    21 {  
    22     table[++tot].to=y;  
    23     table[tot].f=z;  
    24     table[tot].next=head[x];  
    25     head[x]=tot;  
    26     table[++tot].to=x;  
    27     table[tot].f=0;  
    28     table[tot].next=head[y];  
    29     head[y]=tot; 
    30 }  
    31     bool bfs()  
    32     {  
    33         static int q[M];  
    34         int i,r=0,h=0;  
    35         memset(dpt,-1,sizeof dpt);  
    36         dpt[S]=1;q[++r]=S;  
    37         while(r!=h)  
    38         {  
    39             int x=q[++h];  
    40             for(i=head[x];i;i=table[i].next)  
    41                 if(table[i].f&&!~dpt[table[i].to])  
    42                 {  
    43                     dpt[table[i].to]=dpt[x]+1;  
    44                     q[++r]=table[i].to;  
    45                     if(table[i].to==T)  
    46                         return true;  
    47                 }  
    48         }  
    49         return false;  
    50     }  
    51     int dfs(int x,int flow)  
    52     {  
    53         int i,left=flow;  
    54         if(x==T) return flow;  
    55         for(i=head[x];i&&left;i=table[i].next)  
    56             if(table[i].f&&dpt[table[i].to]==dpt[x]+1)  
    57             {  
    58                 int temp=dfs(table[i].to,min(left,table[i].f) );  
    59                 left-=temp;  
    60                 table[i].f-=temp;  
    61                 table[i^1].f+=temp;  
    62             }  
    63         if(left) dpt[x]=-1;  
    64      return flow-left;  
    65     }  
    66 int main()  
    67 {  
    68     scanf("%d%d",&n,&m);
    69     for(int i=1;i<=n;i++)
    70         for(int j=1;j<=n;j++)
    71             map[i][j]=INF;
    72     for(i=1;i<=n;i++)  
    73         map[i][i]=0;  
    74     for(i=1;i<=m;i++)  
    75     {  
    76         scanf("%d%d%d%d",&x,&y,&z,&e[i].c);  
    77         e[i].x=x;e[i].y=y;e[i].f=z;  
    78         map[x][y]=map[y][x]=z;  
    79     }  
    80     for(k=1;k<=n;k++)  
    81         for(i=1;i<=n;i++)  
    82             for(j=1;j<=n;j++)  
    83                 map[i][j]=min(map[i][j],map[i][k]+map[k][j]);  
    84     printf("%d
    ",map[1][n]);
    85     for(i=1;i<=m;i++)  
    86     {  
    87         x=e[i].x;y=e[i].y;z=e[i].f;  
    88         if( map[1][x]+map[y][n]+z==map[1][n] )  
    89             add(x,y,e[i].c);  
    90         if( map[1][y]+map[x][n]+z==map[1][n] )  
    91             add(y,x,e[i].c);  
    92     }  
    93     while( bfs() )  
    94         ans+=dfs(1,INF);  
    95     printf("%d",ans);
    96     return 0;  
    97 }  
  • 相关阅读:
    Unix环境高级编程—进程关系
    如何学习CCIE
    Unix环境高级编程—进程控制(三)
    Unix环境高级编程—进程控制(二)
    _THROW 何解?
    Unix高级环境编程—进程控制(一)
    ifndef/define/endif 和 #ifdef 、#if 作用和用法
    内存MCE错误导致暴力扩充messages日志 以及chattr记录
    Intellij IDEA的安装和激活
    Xshell和Xftp间隔一段时间不操作就自动断开连接?
  • 原文地址:https://www.cnblogs.com/wanglichao/p/5900950.html
Copyright © 2020-2023  润新知