HDU 1874スムーズな交通プロジェクト(シングルエンドダイクストラ法のための単一の出発点)

問題の説明の
省は、長年のプロジェクトの円滑な実施以来、最終的には多くの道路を造りました。しかし、もっと良い方法ではありませんが、1つの町から別のたびに、から選択する道路制度の多くの種類があり、そしていくつかのプログラムは、他のプログラム、他よりもはるかに短い徒歩圏内です。これは、歩行者が非常に悩まさことができます。
さて、開始点と終了点が知られている、あなたは最短距離を歩くために必要などのくらいの、最初から最後まで計算します。

入力
このトピックでは、ファイルの末尾に複数のデータセット、処理が含まれています。
各テストラインは2つの正の整数NとM(0 <N <200,0 <含ま M <1000)、 町の数を表し、既存の道路の数が構築されています。都市部では0〜N-1の番号が付けられています。
Mライン道路情報が続きます。各行は三つの整数A、B、X(0 <含ま = A、B <N、A!= B、0 <X <10000)、 町や都市A B X双方向道路の長さの間に発現します。
次の行は、二つの整数S、T(0 <= S、続いて 、T <N) の開始点と終了点を表します。

出力
データのセットごとに、最小からの出力は、1つのラインの上を歩くために必要。TのSからのルートが存在しない場合は、-1の出力。

サンプル入力
3 3
0 1 1
0 2 3
1 2 1
0 2
3 1
0 1 1
1 2

サンプル出力
2
-1

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
using namespace std;
//这道题倒像是迪杰特斯拉的套用模板就行,这道新的题的难点在于,需要判断最后是否存在这个路径,我的想法是,看最后那个路径长度是不是大于我给定的原始值100,如果大于
//如果大于,说明就不行其实可以就直接照搬源码的,但是想想,还是自己再写一遍吧
int n,m;
int a,b,x;
int q,t;
bool mark[100];
int maplen[100][100];
int dis[100];
int i,j,k;
void Dj(int s){
    //先初始化
    for(i=0;i<n;i++){
        dis[i]=maplen[s][i];
        mark[i]=false;
    }
    dis[s]=0;
    mark[s]=true;
    //开始循环
    for(i=0;i<n-1;i++){
        int mmin=1000;
        for(j=0;j<n;j++){
            if(!mark[j]&&dis[j]<mmin){
                k=j;
                mmin=dis[j];
            }
        }
        mark[k]=true;
        for(j=0;j<n;j++){
            if(!mark[j]&&dis[j]>(dis[k]+maplen[k][j]))
                dis[j]=(dis[k]+maplen[k][j]);
        }
    }
}

int main(){
    //输入入口和路
    while(scanf("%d%d",&n,&m)!=EOF&&n!=0&&m!=0){
    //初始化maptime
    for(i=0;i<n;i++)
        for(j=0;j<n;j++)
        maplen[i][j]=100;
    //开始输入边
    for(i=0;i<m;i++){
        scanf("%d%d%d",&a,&b,&x);
        maplen[a][b]=x;
        maplen[b][a]=x;
    }
    //开始输入起点和终点
    scanf("%d%d",&q,&t);
    Dj(q);
    if(dis[t]>=100)
        printf("-1\n");
    else
        printf("%d\n",dis[t]);

}
}

公開された72元の記事 ウォンの賞賛5 ビュー2798

おすすめ

転載: blog.csdn.net/qq_41115379/article/details/104991510