POJ-2387 Til the Cows Come Home (最短路-Dijkstra之邻接矩阵)

题目链接

题意:给出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;
}



 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值