CDOJ 30 最短路

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CDOJ 30 最短路相关的知识,希望对你有一定的参考价值。

在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的T-shirt。但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最短的从商店到赛场的路线,你可以帮助他们吗?

Input

输入包括多组数据。

每组数据第一行是两个整数N,M(N100,M10000),N表示成都的大街上有几个路口,标号为1的路口是商店所在地,标号为N的路口是赛场所在地,M则表示在成都有几条路。N=M=0表示输入结束。

接下来M行,每行包括3个整数A,B,C(1A,BN,1C1000),表示在路口A与路口B之间有一条路,我们的工作人员需要C分钟的时间走过这条路。

输入保证至少存在1条商店到赛场的路线。

Output

对于每组输入,输出一行,表示工作人员从商店走到赛场的最短时间。

Sample input and output

Sample InputSample Output
2 1
1 2 3
3 3
1 2 5
2 3 5
3 1 2
0 0
3
2
#include <iostream>
using namespace std;

const int inf=0x7fffffff;

struct adjvex{
    int num,w;
    adjvex *next;
};

struct node{
    int dis;
    bool flag;
    adjvex *next;
};

void build_G(node *v,adjvex *e,int n,int m) {
    int A,B,C,id=0;
    adjvex *p;
    for (int i=0; i<105; i++)
        v[i].next=NULL;
    for (int i=0; i<m; i++) {
        scanf("%d%d%d",&A,&B,&C);
        e[id].num=B;
        e[id].w=C;
        e[id].next=v[A].next;
        v[A].next=&e[id];
        id++;
        e[id].num=A;
        e[id].w=C;
        e[id].next=v[B].next;
        v[B].next=&e[id];
        id++;
    }
    for (int i=2; i<105; i++) {
        v[i].dis=inf;
        v[i].flag=0;
    }
    v[1].dis=0;
    v[1].flag=1;
    p=v[1].next;
    while (p!=NULL) {
        v[p->num].dis=p->w;
        p=p->next;
    }
}

void Dijkstra(node *v,int n) {
    int minw,minindex;
    adjvex *p;
    while (1) {
        minw=inf;
        minindex=-1;
        for (int j=2; j<=n; j++) {
            if (v[j].flag==0&&v[j].dis<minw) {
                minw=v[j].dis;
                minindex=j;
            }
        }
        if (minindex==-1) break;
        if (minindex==n) {
            printf("%d\n",v[n].dis);
            return;
        }
        v[minindex].flag=1;
        p=v[minindex].next;
        while (p!=NULL) {
            if (v[p->num].flag==0&&v[p->num].dis>v[minindex].dis+p->w)
                v[p->num].dis=v[minindex].dis+p->w;
            p=p->next;
        }
    }
    printf("%d\n",v[n].dis);
}

int main() {
    int N,M;
    while (scanf("%d%d",&N,&M)==2) {
        if (N==0&&M==0)
            break;
        node v[105];
        adjvex e[20010];
        build_G(v,e,N,M);
        Dijkstra(v,N);
    }
}

 

以上是关于CDOJ 30 最短路的主要内容,如果未能解决你的问题,请参考以下文章

A1111 Online Map (30分)(最短路径Dijkstra+DFS)

1087. All Roads Lead to Rome (30)最短路——PAT (Advanced Level) Practise

UESTC30-最短路-Floyd最短路spfa+链式前向星建图

UESTC 30最短路(flyod算法)

1131 Subway Map (30 分)难度: 难 / Dijkstra最短路

1030 Travel Plan (30 分) 难度: 中 / 知识点: 最短路