题意:给出m条边,n个点1~n,求1到n的最短距离,数据很小
题解:Dijkstra-邻接矩阵即可~
代码如下:
#include<iostream>
#include<cstring>
#include<string>
#include<cstdio>
#include<cmath>
#include<vector>
#include<queue>
#include<map>
#include<algorithm>
using namespace std;
#define ll long long
#define inf 0x3f3f3f3f
const int maxn = 2000;
int n, mp[maxn][maxn], dis[maxn];//dis[]存的是s点到其他各个点的最短距离
bool vis[maxn]; //用于记录点的访问情况
int pre[maxn]; //用于记录前驱点
int Dijkstra(int s, int t) //s=起点 ,t=终点
{
for (int i = 1; i <= n; i++)
{
dis[i] = mp[s][i];
vis[i] = false;
pre[i] = (dis[i] == inf ? -1 : s);
}
dis[s] = 0;
vis[s] = true;
int u;
for (int i = 2; i <= n; i++) //扩展n-1个点(不存在负环情况下可以遍历到s外所有点)
{
int min = inf;
u = s;
for (int j = 1; j <= n; j++)
if ((!vis[j]) && dis[j] < min)
{
u = j;
min = dis[j];
}
if (u == s) break; //说明已经无法更新了
vis[u] = true;
for (int j = 1; j <= n; j++) //松弛并记录前驱结点
if (!vis[j] && dis[u] + mp[u][j] < dis[j])
{
dis[j] = dis[u] + mp[u][j];
pre[j] = u;
}
}
return dis[t]; //实际dis已经保存了s到所有点的最短距离
}
void dfs(int x, int cnt) //路径
{
if (pre[x] != -1)
{
dfs(pre[x], cnt + 1);
printf("%d%c", x, cnt == 1 ? '\n' : ' ');
}
else
cout << "1 ";
}
int main()
{
int m, u, v, w;
while (~scanf("%d%d", &m, &n))
{
memset(mp, inf, sizeof(mp));
while (m--)
{
scanf("%d%d%d", &u, &v, &w);
mp[v][u] = mp[u][v] = min(mp[u][v], w);//无向图(同时避免出现重边情况)
}
printf("%d\n", Dijkstra(1, n));
//dfs(n,1); //输出路径
}
return 0;
}