您的位置:首页 > Web前端

两道最短路裸题(HDU 2544 最短路 / HDU 1596 find the safest road)

2016-08-20 11:02 393 查看
题目链接:HDU 2544 最短路

题意:给出n个点,m条边的图,求
1
n
的 最短路。

代码:

#include <stdio.h>
#include <algorithm>
#include <string.h>
#include <vector>
#include <queue>
#include <iostream>

using namespace std;

const int M = 1e5 + 10;
const int N = 1e2 + 10;
const int INF = 0x3f3f3f3f;

struct Node {
int p, dis;

Node() {}

Node(int a, int b) {
p = a;
dis = b;
}

friend bool operator < (Node a, Node b) {
return a.dis > b.dis;
}
};

int x[M], y[M], z[M];
int edge

;
int d
;
int ct
;
bool inq
;
int n, m;

int dij() {
priority_queue<Node> q;
q.push(Node(1, 0));
d[1] = 0;
while (!q.empty()) {
Node f = q.top();
q.pop();
for (int i = 1; i <= n; i++) {
if (d[i] > edge[f.p][i] + f.dis) {
d[i] = edge[f.p][i] + f.dis;
q.push(Node(i, d[i]));
}
}
}
return d
;
}

int bf() {
d[1] = 0;
for (int i = 0; i < n; i++) {
for (int j = 0; j < 2 * m; j++) {
int a = x[j], b = y[j], c = z[j];
d[a] = min(d[a], d[b] + c);
}
}
return d
;
}

int floyd() {
for (int i = 1; i <= n; i++)
edge[i][i] = 0;
for (int k = 1; k <= n; k++) {
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
edge[i][j] = min(edge[i][j], edge[i][k] + edge[k][j]);
}
}
}
return edge[1]
;
}

int spfa() {
queue<int> q;
q.push(1);
d[1] = 0;
inq[1] = true;
ct[1] = 1;
while (!q.empty()) {
int u = q.front();
q.pop();
inq[u] = false;
for (int i = 1; i <= n; i++) {
if (d[i] > d[u] + edge[u][i]) {
d[i] = d[u] + edge[u][i];
if (!inq[i]) {
q.push(i);
inq[i] = true;
ct[i]++;
if (ct[i] == n)
return -1;
}
}
}
}
return d
;
}

int main() {
while (scanf("%d%d", &n, &m) != EOF) {
if (!n && !m)
break;
memset(edge, INF, sizeof(edge));
memset(d, INF, sizeof(d));
memset(inq, false, sizeof(inq));
memset(ct, 0, sizeof(ct));
for (int i = 0; i < m; i++) {
int u, v, w;
scanf("%d%d%d", &u, &v, &w);
edge[u][v] = min(edge[u][v], w);
edge[v][u] = min(edge[v][u], w);
x[2 * i] = u, y[2 * i] = v, z[2 * i] = w;
x[2 * i + 1] = v, y[2 * i + 1] = u, z[2 * i + 1] = w;
}
// printf("%d\n", dij());
// printf("%d\n", bf());
// printf("%d\n", spfa());
printf("%d\n", floyd());
}
return 0;
}


题目链接:HDU 1596 find the safest road

题意:给出
n
个点的图,边以邻接矩阵的形式给出,
q
组查询,每次查询从
u
v
的最大安全系数。边的安全系数之间为相乘的形式。

代码:

#include <stdio.h>
#include <algorithm>
#include <string.h>
#include <vector>
#include <queue>
#include <iostream>

using namespace std;

const int N = 1e3 + 10;
const double EPS = 1e-5;

struct Node {
int p;
double safe;

Node() {}

Node(int a, double b) {
p = a;
safe = b;
}

friend bool operator < (Node a, Node b) {
return a.safe < b.safe;
}
};

double edge

;
double d

;
bool vis
;
int n, q;

void dij(int s) {
priority_queue<Node> q;
q.push(Node(s, 1));
d[s][s] = 1;
while (!q.empty()) {
Node now = q.top();
q.pop();
for (int i = 1; i <= n; i++) {
if (d[s][i] < now.safe * edge[now.p][i]) {
d[s][i] = now.safe * edge[now.p][i];
q.push(Node(i, d[s][i]));
}
}
}
}

int main() {
while (scanf("%d", &n) != EOF) {
memset(vis, false, sizeof(vis));
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
scanf("%lf", &edge[i][j]);
d[i][j] = 0;
}
}
scanf("%d", &q);
for (int i = 1; i <= q; i++) {
int u, v;
scanf("%d%d", &u, &v);
if (!vis[u]) {
vis[u] = true;
dij(u);
}
if (d[u][v] != 0)
printf("%.3lf\n", d[u][v]);
else
printf("What a pity!\n");
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  dijkstra floyd spfa