首页 > 代码库 > 【不可能的任务21/200】bzoj1266最短路+最小割
【不可能的任务21/200】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\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/200】bzoj1266最短路+最小割
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。