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]);
}