POJ 2387 Til the Cows Come Home 解题报告 最短路 dijkstra

POJ 2387 Til the Cows Come Home 解题报告

解题思路:我个人认为,dijkstra算法精髓在于消去节点,每次寻找离初始点最近的点(假设叫a节点),然后把初始点到所有和这个a节点直接连接的点(假设叫b节点)的距离全部更新一次,在初始点到b节点的距离和初始点通过a节点到b节点的距离中取小值,这样就达到了消去a节点的效果。代码实现如下。
在这里插入图片描述

#include <stdio.h>
#include<iostream>
#include <algorithm>
#include<string.h>
#include<cmath>
#pragma warning(disable:4996)
#define inf 0x3f3f3f3f
#define ll unsigned long long
const int maxn = 1005;
using namespace std;
int path[maxn][maxn], dis[maxn], vis[maxn];
int main()
{
	int t, n;
	while (~scanf("%d%d", &t, &n))
	{
		for (int i = 1; i <= n; i++)
		{
			for (int j = 1; j <= n; j++)
			{
				path[i][j] = path[j][i] = inf;//无向图双向都赋值成正无穷
			}
		}
		int a, b, c;
		for (int i = 1; i <= t; i++)
		{
			scanf("%d%d%d", &a, &b, &c);
			if (c<path[a][b])
			{
				path[a][b] = path[b][a] = c;
			}
		}
		memset(vis, 0, sizeof(vis));
		//下面计算从1到n的最短路
		for (int i = 1; i <= n; i++)
		{
			dis[i] = path[1][i];//dis储存1到i的最短路径
		}
		vis[1] = 1;
		int tem,id=1;
		for (int i = 1; i <= n; i++)//i无意义,只用来进行循环
		{
			tem = inf;
			for (int j = 1; j <= n; j++)
			{
				if (!vis[j] && dis[j] < tem)
				{
					id = j;
					tem = dis[j];
				}
			}
			vis[id] = 1;
			for (int k = 1; k <= n; k++)
			{
				tem = path[id][k];
				if(!vis[k]&&tem<inf&&dis[id]+tem<dis[k])
				{
					dis[k] = dis[id] + tem;
				}
			}
		}
		printf("%d\n", dis[n]);
	}

}


发布了64 篇原创文章 · 获赞 0 · 访问量 1436

猜你喜欢

转载自blog.csdn.net/weixin_45566331/article/details/105147807