ブロック解除された作品の続きHDU-1874(ダイクストラ)

州は、長年にわたるスムーズフロープロジェクト計画を実施した後、ようやく多くの道路を建設しました。ただし、道路を増やすのは良くありません。ある町から別の町に移動するたびに、選択できる道路計画がたくさんあり、計画によっては他の計画よりもはるかに短い距離になります。これは歩行者を悩ませます。

始点と終点がわかったので、始点から終点までの移動に必要な最短距離を計算してください。
入力
この質問には複数のデータセットが含まれています。ファイルの最後まで処理してください。
データの各グループの最初の行には、2つの正の整数NとM(0 <N <200、0 <M <1000)が含まれています。これらは、既存の町の数と建設された道路の数を表します。町には0からN-1までの番号が付けられています。
次はM線道路情報です。各線には3つの整数A、B、X(0 <= A、B <N、A!= B、0 <X <10000)があり、町Aと町Bの間に長さXの双方向道路があることを示しています。 。
次の行には、2つの整数S、T(0 <= S、T <N)があり、それぞれ開始点と終了点を表します。
出力
データのグループごとに、1行で移動するのに必要な最短距離を出力してください。SからTへのルートがない場合は、出力-1。
サンプル入力

3 3
0 1 1
0 2 3
1 2 1
0 2
3 1
0 1 1
1 2

サンプル出力

2
-1

タイトル説明:

	让你计算从A城镇(起点)到B城镇(终点)的最短距离。

問題解決のアイデア:

	最短路算法的模板题。我使用的是Dijkstra算法。

ACコード:

#include<stdio.h>
#include<string.h>
#define INF  99999999
int e[220][220],n,m;
int main()
{
    
    
	while (scanf("%d %d",&n,&m)!=EOF)
	{
    
    
		int i,j,a,b,x,s,t,k;
		for (i=0;i<n;i++)
		{
    
    
			for (j=0;j<n;j++)
			{
    
    
				if (i==j)
				e[i][j]=0;
				else
				e[i][j]=INF;
			}
		}
		for (i=0;i<m;i++)
		{
    
    
			scanf ("%d%d%d",&a,&b,&x);
			if (e[a][b]>x)
			{
    
    
				e[a][b]=e[b][a]=x;
			}
		}
		for (k=0;k<n;k++)
		{
    
    
			for (i=0;i<n;i++)
			{
    
    
				for (j=0;j<n;j++)
				{
    
    
					if (e[i][j]>e[i][k]+e[k][j])
					e[i][j]=e[i][k]+e[k][j];
				}
			}
		}
		scanf("%d%d",&s,&t);
		if (e[s][t]!=INF)
		{
    
    
			printf("%d\n",e[s][t]);
		}
		else
		printf ("-1\n");
	}
	return 0;
}

おすすめ

転載: blog.csdn.net/weixin_46703995/article/details/109059432