題意是給乙個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...