#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <map>
#include <functional>
using namespace std;
typedef pair<int, int> P;
const int INF = 0x3f3f3f3f;
const int maxn = 1e4 + 10;
int T, n, cnt, ans, d[maxn], vis[maxn];
struct Edge {
int u, v, cost;
}edge[maxn];
vector<P> G[maxn];
map<P, int> m;
void init() {
cnt = 0; ans = INF;
for (int i = 0; i < maxn; i++) {
G[i].clear();
}
m.clear();
}
void dijkstra(int s, int e, int x) {
for (int i = 0; i < maxn; i++) {
d[i] = INF;
vis[i] = 0;
}
d[s] = 0;
priority_queue<P, vector<P>, greater<P> > q;
q.push(make_pair(0, s));
while (!q.empty()) {
P p = q.top(); q.pop();
int u = p.second, dis = p.first;
if (dis + x >= ans) break;
if (vis[u]) continue;
vis[u] = 1;
for (int i = 0; i < G[u].size(); i++) {
int v = G[u][i].first, id = G[u][i].second;
int cost = edge[id].cost;
if (d[v] > d[u] + cost) {
d[v] = d[u] + cost;
q.push(make_pair(d[v], v));
}
}
}
ans = min(ans, d[e] + x);
}
int main() {
scanf("%d", &T);
for (int kase = 1; kase <= T; kase++) {
scanf("%d", &n);
init();
for (int i = 1; i <= n; i++) {
int x1, y1, x2, y2, w;
scanf("%d %d %d %d %d", &x1, &y1, &x2, &y2, &w);
P p1 = make_pair(x1, y1), p2 = make_pair(x2, y2);
if (!m[p1]) m[p1] = ++cnt;
if (!m[p2]) m[p2] = ++cnt;
int u = m[p1], v = m[p2];
G[u].push_back(make_pair(v, i)); G[v].push_back(make_pair(u, i));
edge[i].u = u, edge[i].v = v, edge[i].cost = w;
}
for (int i = 1; i <= n; i++) {
int u = edge[i].u, v = edge[i].v, cost = edge[i].cost;
edge[i].cost = INF;
dijkstra(u, v, cost);
edge[i].cost = cost;
}
if (ans == INF) ans = 0;
printf("Case #%d: %d\n", kase, ans);
}
return 0;
}
HDU 6005 Pandaland——dijkstra + 剪枝
原创
©著作权归作者所有:来自51CTO博客作者软糖酱八号机的原创作品,请联系作者获取转载授权,否则将追究法律责任
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
GaussDB(for MySQL)剪枝功能,让查询性能提升70倍!
如何通过MySQL提升DISTINCT,尤其是多表连接下DISTINCT的查询效率?
MySQL 表连接 执行效率 DISTINCT SQL语句 -
HDU 6005 Pandaland(dijkstra + 剪枝)
题意:给你一个m 个边的无向图,要求在图上找一个最小的环(边权)。思路:好暴
dijkstra ci #include Java -
HDU 6005 Pandaland 最小环(dijkstra+剪枝)
大致题意就是,给你一
i++ sed 最小环 -
hdu1455 Sticks(搜索+剪枝+剪枝+.....+剪枝)
SticksTime Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K
hdu1455 hdu 1455 搜索+剪枝 #include i++ -
hdu 1692(枚举+剪枝)
题意:给你一些井的信息,井中原有
dp #include i++ ios -
HDU 6005 Pandaland (Dijkstra)
题意:给定一个图,找出一个最小环。 析:暴力枚举每一条,然后把边设置为最大值,以后就不用改回来了,然后跑一遍最短路,跑 n 次就好。 代码如下:
#include #define ios #pragma 最短路