您的位置:首页 > 其它

hdoj2544 最短路(Dijkstra || Floyd || SPFA)

2017-12-04 15:59 549 查看

题目链接

http://acm.hdu.edu.cn/showproblem.php?pid=2544

思路

最短路算法模板题,求解使用的Dijkstra算法、Floyd算法、SPFA算法可以当做求解最短路问题的模板使用。

代码

Dijkstra算法:

#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;

const int INF = 0x3f3f3f;
const int N = 100 + 10;
int map

;
int dist
;
int visit
;
int n, m;

void dijkstra()
{
memset(visit, 0, sizeof(visit));
for (int i = 1; i <= n; i++)
dist[i] = map[1][i];
dist[1] = 0;
int min_dist, now;
for (int i = 1; i <= n; i++)
{
min_dist = INF;
for (int j = 1; j <= n; j++)
{
if (!visit[j] && dist[j] < min_dist)
{
min_dist = dist[j];
now = j;
}
}
if (min_dist == INF) break;
visit[now] = 1;
for (int j = 1; j <= n; j++)    //“松弛”操作
{
if (dist[now] + map[now][j] < dist[j])
dist[j] = dist[now] + map[now][j];
}
}
printf("%d\n", dist
);
}

int main()
{
//freopen("hdoj2544.txt", "r", stdin);
while (scanf("%d%d", &n, &m) == 2 && n)
{
memset(map, INF, sizeof(map));
int a, b, c;
for (int i = 0; i < m; i++)
{
scanf("%d%d%d", &a, &b, &c);
map[a][b] = map[b][a] = c;
}
dijkstra();
}
return 0;
}

Floyd算法:

#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;

const int INF = 0x3f3f3f;
const int N = 100 + 10;
int map

;
int n, m;

void floyd()
{
for (int k = 1; k <= n; k++)
for (int i = 1; i <= n; i++)
for (int j = 1;j <= n; j++)
map[i][j] = min(map[i][j], map[i][k] + map[k][j]);
printf("%d\n", map[1]
);
}

int main()
{
//freopen("hdoj2544.txt", "r", stdin);
while (scanf("%d%d", &n, &m) == 2 && n)
{
memset(map, INF, sizeof(map));
int a, b, c;
for (int i = 0; i < m; i++)
{
scanf("%d%d%d", &a, &b, &c);
map[a][b] = map[b][a] = c;
}
floyd();
}
return 0;
}

SPAF算法:

#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <queue>
#include <vector>
using namespace std;

struct Edge
{
int s, e, dist;    //边的起点、终点、长度

Edge() {}
Edge(int s, int e, int d) :s(s), e(e), dist(d) {}
};

const int INF = 0x3f3f3f;
const int N = 100 + 10;
vector<Edge> v
;    //使用邻接表存储图
int dist
;
int visit
;
int n, m;

void spfa(int s)
{
queue<int> q;
memset(dist, INF, sizeof(dist));
memset(visit, 0, sizeof(visit));
q.push(s);
visit[s] = 1;
dist[s] = 0;

while (!q.empty())
{
int s = q.front();
q.pop();
visit[s] = 0;
for (int i = 0; i < v[s].size(); i++)
{
int e = v[s][i].e;
if (dist[e] > dist[s] + v[s][i].dist)
{
dist[e] = dist[s] + v[s][i].dist;
if (visit[e] == 0)
{
visit[e] = 1;
q.push(e);
}
}
}
}
printf("%d\n", dist
);
}

int main()
{
//freopen("hdoj2544.txt", "r", stdin);
while (scanf("%d%d", &n, &m) == 2 && n)
{
for (int i = 1;i <= n; i++)
v[i].clear();
int a, b, c;
for (int i = 0; i < m; i++)
{
scanf("%d%d%d", &a, &b, &c);
v[a].push_back(Edge(a, b, c));
v[b].push_back(Edge(b, a, c));
}
spfa(1);    //求结点1到其余各点的最短路径
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: