不可能的任务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 floyd建出最短路图+最小割