HDU5294 最短路,最大流

2021-07-05 15:03:35 字數 1887 閱讀 1629

題意是給乙個n點m邊的無向圖,求最少去掉多少邊使得最短路不存在,和最短路存在的情況下最多去掉多少邊。

把所有最短路上的邊搞進來,流量為1跑最大流,去掉多少邊只要搞個dp就能找到最短路圖上得最短的路,用m去減就行。

因為n<=2000,n^2複雜度隨便搞都行。

坑點是有重邊。

#include #include #include #include #include #include #include using namespace std;

#define maxn 2111

#define maxm 121111

#define inf 1000000000

struct node edge[maxm], edge1[maxm];

int cnt;

int head[maxn];

int n, m, u, v, w;

int mp[maxn][maxn], num[maxn][maxn]; //記錄重邊

long long d1[maxn], d2[maxn];

bool vis[maxn];

void init ()

}}void dij (int from, int to)

vis[x] = 1;

for (int j = 1; j <= n; j++)

}return ;

}void anti_dij (int from, int to)

vis[x] = 1;

for (int j = 1; j <= n; j++)

}return ;

}void add_edge (int from, int to, int cap, int i)

int d[maxn]; //從起點到i的距離

bool vis_edge[maxm];

bool bfs (int s, int t) }}

return 0;

}int dfs (int u, int a, int t)

}return flow;

}long long maxflow (int s, int t)

return ans;

}int cnt1;

int head1[maxn];

int son[maxn];

void dfs1 (int u)

if (child == 0)

son[u] = 0;

}void add_edge1 (int from, int to, int i)

int main ()

else if (mp[u][v] == w)

}dij (1, n);

anti_dij (n, 1);

long long min = d1[n];

cnt1 = 0;

memset (head1, -1, sizeof head1);

for (int i = 1; i <= n; i++) }}

}}

dfs1 (1);

printf ("%lld %d\n", maxflow (1, n), m-son[1]);

}return 0;}/*

6 6

1 2 1

2 3 2

3 6 3

1 4 3

4 5 2

5 6 1

2 2

1 2 1

1 2 1

8 91 2 1

2 3 1

3 4 1

4 8 1

2 7 1

1 5 1

5 6 1

6 7 1

7 8 1

*/

hdu 3599 最短路 最大流)

思路 首先spfa求一下最短路,然後對於滿足最短路上的邊 dist v dist u w 加入到新圖中來,邊容量為1,最後求出的最大流就是沒有相交的邊的最短路徑條數。1 include2 include3 include 4 include5 include6 include7 using name...

hdu3416 最短路 最大流

最短路 最大流 用spfa算出 s到各個點的最短路 t到各個點的最短路 if dis1 i dis2 i map i j dis1 t 滿足這種情況說明邊在最短路上,所以根據這個方法建邊 然後最大流解決 這道題很值得體會體會 this code is made by linmeichen probl...

hdu 3599 最短路 最大流)

思路 首先spfa求一下最短路,然後對於滿足最短路上的邊 dist v dist u w 加入到新圖中來,邊容量為1,最後求出的最大流就是沒有相交的邊的最短路徑條數。1 include2 include3 include 4 include5 include6 include7 using name...