POJ-2387-Til the Cows Come Home 解题报告

       这是一个简单的最短路问题。题意:给定有N个地点(编号从1到N),T条道路,先输入两个正整数T和N,然后接下来T行,每行三个整数,分别代表这条道路的起点终点和长度。要求求出从N到1的最短路、、、


       解法:不能用Floyd,因为节点达到了1000,Floyd的时间复杂度为O(n的三次方),会TLE。用普通的Dijkstra就行了。


       注意:题目数据有些坑、、、题目意思是说道路最大长度不超过100,但是实际上可能达到了几十万,因此建议将最大值调大一些。而且,输入会有重边,这点很容易忽略。另外,此题是多case的。


       接下来是解题代码:Dijkstra解法

#include <stdio.h>
#define N 2001
#define MAX 99999999

int map[N][N];  //建立图,map[i][j]代表i到j的距离
int dis[N];     //dis[i]代表起点到i的距离
int flag[N];    //标记变量
int t, n;

void Init();    //初始化

void Read();    //输入

void Dijkstra();

int main()
{
    while (~scanf("%d %d", &t, &n))
    {
        Init();
        Read();
        Dijkstra();
        printf("%d\n", dis[1]);
    }
    return 0;
}

void Init()     //初始化
{
    int i, j;
    for (i=0; i<N; i++)
    {
        for (j=0; j<N; j++)
        {
            map[i][j] = MAX;
        }
        flag[i] = 0;
        dis[i] = MAX;
    }
    return;
}

void Read()     //输入
{
    int i;
    int a, b, len;
    for (i=0; i<t; ++i)
    {
        scanf("%d %d %d", &a, &b, &len);
        if (map[a][b] > len)        //解决重边问题
        {
            map[a][b] = map[b][a] = len;
        }
    }
    return;
}

void Dijkstra()
{
    int i, j, k;
    int min;
    dis[n] = 0;
    for (i=1; i<=n; ++i)
    {
        min = MAX;
        for (j=1; j<=n; ++j)
        {
            if (flag[j] == 0 && dis[j] < min)
            {
                min = dis[k = j];
            }
        }
        flag[k] = 1;
        for (j=1; j<=n; ++j)
        {
            if (dis[j] > dis[k] + map[k][j])
            {
                dis[j] = dis[k] + map[k][j];
            }
        }
    }
    return;
}

没有更多推荐了,返回首页