【不可能的任务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 }  
时间: 2024-10-12 16:40:34

【不可能的任务21/200】bzoj1266最短路+最小割的相关文章

Educational Codeforces Round 21 Problem F (Codeforces 808F) - 最小割 - 二分答案

Digital collectible card games have become very popular recently. So Vova decided to try one of these. Vova has n cards in his collection. Each of these cards is characterised by its power pi, magic number ci and level li. Vova wants to build a deck

【bzoj1266】[AHOI2006]上学路线route 最短路+最小割

题目描述 可可和卡卡家住合肥市的东郊,每天上学他们都要转车多次才能到达市区西端的学校.直到有一天他们两人参加了学校的信息学奥林匹克竞赛小组才发现每天上学的乘车路线不一定是最优的. 可可:“很可能我们在上学的路途上浪费了大量的时间,让我们写一个程序来计算上学需要的最少时间吧!” 合肥市一共设有N个公交车站,不妨将它们编号为1…N的自然数,并认为可可和卡卡家住在1号汽车站附近,而他们学校在N号汽车站.市内有M条直达汽车路线,执行第i条路线的公交车往返于站点pi和qi之间,从起点到终点需要花费的时间为

【不可能的任务12/200】bzoj1412最小割

太羞耻了,m n写反了(主要是样例n m相等) 建图方法比较高(ji)端(chu),对于可以加栅栏的地方连上1的边,然后求最小割即可 为了让代码优(suo)美(duan),我写了一个check,避免多次重复的时候犯错(简直是我这种mn都能打反的人必备) 1 #include <cstdio> 2 #define INF 2147483647 3 int n,m,N=1,h,t,zl,ans; 4 int a[101][101],fir[10100],d[10100],to[100000],fl

【最短路】【spfa】【最小割】【Dinic】bzoj1266 [AHOI2006]上学路线route

原问题等价于断掉一些边,让原来所有的最短路全都无法联通S和T. 先求最短路,然后把在最短路上的边(dis[u[i]]+w[i]==dis[v[i]])加入新图里,跑最小割.显然. 注意是无向图. #include<cstdio> #include<cstring> #include<queue> #include<algorithm> using namespace std; #define INF 2147483647 #define MAXN 511 #

【BZOJ1266】【AHOI2006】上学路线route 最短路建图转最小割

题解: 首先那个裸的单源最短路过程就过了吧. 然后说转的最小割. 就是我们考虑到从源点到汇点有多条最短路,我们需要切断一些边,使得所有的最短路都被切断. 首先这是个很裸的模型,切断?最小割! 如果你想不到,那不妨这么想: 我们切断所有最短路,那么每条最短路都有一个路径,上面有若干条边,那么我们需要至少切断其中的一部分. 而所有的局部最短路都满足一个性质: 就是从源点到某点的最短路长度固定(这个很显然吧,都"最"短了) 那么我们让所有的最短路径都被切断,就会使得一些在最短路径之一的边被切

bzoj1266 [AHOI2006]上学路线route floyd+最小割

1266: [AHOI2006]上学路线route Time Limit: 3 Sec  Memory Limit: 162 MBSubmit: 2490  Solved: 898[Submit][Status][Discuss] Description 可可和卡卡家住合肥市的东郊,每天上学他们都要转车多次才能到达市区西端的学校.直到有一天他们两人参加了学校的信息学奥林匹克竞赛小组才发现每天上学的乘车路线不一定是最优的. 可可:“很可能我们在上学的路途上浪费了大量的时间,让我们写一个程序来计算上

BZOJ4808: 马&amp;BZOJ3175: [Tjoi2013]攻击装置

BZOJ3175 Description 给定一个01矩阵,其中你可以在0的位置放置攻击装置.每一个攻击装置(x,y)都可以按照“日”字攻击其周围的 8个位置(x-1,y-2),(x-2,y-1),(x+1,y-2),(x+2,y-1),(x-1,y+2),(x-2,y+1), (x+1,y+2),(x+2,y+1)求在装置互不攻击的情况下,最多可以放置多少个装置. Input 第一行一个整数N,表示矩阵大小为N*N.接下来N行每一行一个长度N的01串,表示矩阵. Output 一个整数,表示在

BZOJ1266: [AHOI2006]上学路线route

1266: [AHOI2006]上学路线route Time Limit: 3 Sec  Memory Limit: 162 MBSubmit: 1273  Solved: 435[Submit][Status] Description 可可和卡卡家住合肥市的东郊,每天上学他们都要转车多次才能到达市区西端的学校.直到有一天他们两人参加了学校的信息学奥林匹克竞赛小组才发现每天上学的乘车路线不一定是最优的. 可可:“很可能我们在上学的路途上浪费了大量的时间,让我们写一个程序来计算上学需要的最少时间吧

AHOI2009最小割

1797: [Ahoi2009]Mincut 最小割 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1072  Solved: 446[Submit][Status] Description A,B两个国家正在交战,其中A国的物资运输网中有N个中转站,M条单向道路.设其中第i (1≤i≤M)条道路连接了vi,ui两个中转站,那么中转站vi可以通过该道路到达ui中转站,如果切断这条道路,需要代价ci.现在B国想找出一个路径切断方案,使中转站s不能到