州は、長年にわたるスムーズフロープロジェクト計画を実施した後、ようやく多くの道路を建設しました。ただし、道路を増やすのは良くありません。ある町から別の町に移動するたびに、選択できる道路計画がたくさんあり、計画によっては他の計画よりもはるかに短い距離になります。これは歩行者を悩ませます。
始点と終点がわかったので、始点から終点までの移動に必要な最短距離を計算してください。
入力
この質問には複数のデータセットが含まれています。ファイルの最後まで処理してください。
データの各グループの最初の行には、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;
}