UESTCoj 265 War(Floyd最短路)

来源:互联网 发布:unity3d ubuntu 编辑:程序博客网 时间:2024/05/16 08:07
题目描述:Your country is now involved in a war! In the front, there are N positions between which you can transfer goods. Unfortunately the enemies will attack you and destroy some positions. When transferring, you cannot pass through a position which has been destroyed. As the commander of the army, you want to know the minimum distance between some position u and v, after some positions have been destroyed.

Floyd算法求最短路的原理是枚举每个点做为中点,更新起点和终点的最短距离。
按照题意中的意思是要拆除一些点后再求最短路,我们可以倒着去做认为是新建一些点后再去求最短路,对于每个新建点k,我们只要以k为中点更新一下最短路就行了,更新的过程是O(n^2)的。然后最多新建n个点,所以整个算法复杂度为O(n^3)。
PS:我觉得暴力SPFA应该可以过的,然后就T了。
#pragma warning(disable:4996)#include <cstdio>#include <cstring>#include <algorithm>#include <vector>using namespace std;int dis[205][205];bool exist[205];vector<int>ans;int query[10005], x[10005], y[10005];int n, m;int main(){int t; scanf("%d", &t);while (t--){scanf("%d %d", &n, &m);memset(dis, 0x3f, sizeof dis);memset(exist, true, sizeof exist);for (int i = 1; i <= n; i++)dis[i][i] = 0;for (int i = 0; i < m; i++){int u, v, c; scanf("%d %d %d", &u, &v, &c);dis[u][v] = dis[v][u] = min(dis[u][v], c);}int q; scanf("%d", &q);for (int i = 1; i <= q; i++){int op; scanf("%d", &op);if (op == 0){int u, v; scanf("%d %d", &u, &v);query[i] = 0;x[i] = u;y[i] = v;}else if (op == 1){int u; scanf("%d", &u);exist[u] = false;query[i] = 1;x[i] = u;}}//Floyd求出最短路for (int k = 1; k <= n; k++){if (!exist[k])continue;for (int i = 1; i <= n; i++){for (int j = 1; j <= n; j++){dis[i][j] = min(dis[i][j], dis[i][k] + dis[k][j]);}}}ans.clear();for (int i = q; i >= 1; i--){if (query[i] == 0){if (exist[x[i]] && exist[y[i]]){int tmp = dis[x[i]][y[i]];tmp = tmp == dis[0][0] ? -1 : tmp;ans.push_back(tmp);}else ans.push_back(-1);}//加点else if (query[i] == 1){int k = x[i];exist[k] = true;for (int i = 1; i <= n; i++){for (int j = 1; j <= n; j++){dis[i][j] = min(dis[i][j], dis[i][k] + dis[k][j]);}}}}for (int i = (int)ans.size() - 1; i >= 0; i--){printf("%d\n", ans[i]);}puts("");}return 0;}










0 0
原创粉丝点击