不可能的任务21/200bzoj1266最短路+最小割

Posted 汪立超

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了不可能的任务21/200bzoj1266最短路+最小割相关的知识,希望对你有一定的参考价值。

本来写了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\n",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 }  

 

以上是关于不可能的任务21/200bzoj1266最短路+最小割的主要内容,如果未能解决你的问题,请参考以下文章

BZOJ1266: [AHOI2006]上学路线route

BZOJ 1266 上学路线(最短路+最小割)

bzoj1266 [AHOI2006]上学路线route floyd建出最短路图+最小割

bzoj 1266: [AHOI2006]上学路线route

bzoj 4283 魔法少女伊莉雅 - 最短路

bzoj 2125 最短路 点双 写错了自闭