POJ-2387 Til the Cows Come Home(Dijkstra算法)

POJ-2387 Til the Cows Come Home(Dijkstra算法)

原题链接:http://poj.org/problem?id=2387
专题链接:https://vjudge.net/contest/351234#problem/L

思路


这题的点数到达了1000;不能用floyd莽了,于是被迫又学了一种算法
直接套板子就完事了

AC代码

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
using namespace std;
int arr[1001][1001];//和floyd算法,用于记录道路
bool vis[1001];//用于记录点是否被取
int dis[1001];//用于记录各个点到点1的距离
int T, N;//分别代表道路数和点数
int inf = 1000000000;
int main()
{
	cin >> T >> N;
	for (int i = 1; i <= N; i++)//初始化
		{
			for (int j = 1; j<=N; j++)
				arr[i][j] = inf;
		}
	while (T--)//输入
	{
		int i, j,t;
		scanf("%d%d", &i, &j);
		scanf("%d", &t);
		 if (t < arr[i][j])
		{
			arr[i][j] = t;
			arr[j][i] = t;
		}
	}
	vis[1] = 1;
	for (int i = 2; i <= N; i++)//初始化dis数组
			dis[i] = arr[1][i];
	for (int i = 2; vis[N]!=1; i++)//N被选到就即可结束
	{
		int x;//用于记录剩下的所有点里离1最近的点
		int m = inf;//代表最小值
		for (int y = 2; y <= N; y++)//用于寻找剩下的所有点里离1最近的点
		{
			if (vis[y] == 0 && dis[y] < m)
			{
				m = dis[y];
				x = y;
			}
		}
			vis[x] = 1;
			for (int j = 2; j <= N; j++)//根据刚刚选上的点更新dis数组
				dis[j] = min(dis[j], dis[x] + arr[x][j]);
	}
          printf("%d\n",dis[N]);
}
发布了6 篇原创文章 · 获赞 0 · 访问量 194

猜你喜欢

转载自blog.csdn.net/bllovepigpig/article/details/104010764