記録パスダイクストラ+

彼は新しいガールフレンドを見つけたのでマリカはミルコと非常に怒っていると、彼女は彼女が生きて同じ都市で、彼女はそれが1から来るのにかかるどのように多くの分すべての道のために長いjourney.Weのノウハウのための準備を始めていませんrevenge.Sinceを求めて別の都市。

ミルコは、道路の1が修理中であることを車の中で耳にし、それがブロックされていることが、正確にどの道路konwませんでした。ミルコの道路が閉鎖されていない事項にマリカの街から来ることが可能です。

マリカは唯一の非ブロックされた道路で移動する、と彼女は最短経路で移動します。ミルコは、彼が彼のガールフレンドが何であるかを見つけるのにミルコを助け長いenough.Writeプログラムのために町の外であることを確認してくださいことができるように、彼女は最悪の場合には彼の都市を取得するためにそれが取るどのくらい知りたいですマリカは彼の都市への非ブロックされた道路で、最短ルートで来るのを分単位で最長の時間はかかることがあります。
InputEachケース単一空間、町の数、及び都市間の道路の数によって分離された第1行目の二つの数、N及びMがあります。1≤N≤1000 1≤M≤N *(N-1)/ 2。都市は都市N.でmarkedwithのミルコは、市内1に位置しており、1からNまでの数字、およびマリカです

次のM個の行は、カンマで区切られた3つの数字A、B及びVは、です。1≤A、B≤N、1つの≤V≤1000.Those番号が都市AとBとの間の双方向の道路が存在することを意味し、それはV minutes.OutputInに横断可能であることを出力ファイルの書き込みの最初の行分単位での最大時間、それはミルコに来てマリカを取ることができます。
ミルコは、彼女は復讐を望んでいた、新しいガールフレンドを見つけたのでマリカは、ミルコガスと非常に怒っていました。彼女は同じ都市に住んでいないので、彼女は長い旅の準備を始めました。私たちは、それぞれ、外出先に1つの都市から何分別の都市への一つの方法を知っておく必要があります。ミルコは修理中、道路があり、車で耳が、ブロックされたが、具体的にどの方法を知りません。かかわらず、閉じている方法の、街から街へマリカはミルコの可能性があります。マリカは、道路がブロックされていない、彼女は最短ルートを取るだろうがかかります。ミルコは、彼が町の彼のガールフレンドに十分な長さアウトのことを確認することができますので、それは、彼の町に到達するために彼女を取るどのくらい、最悪の場合には、知りたいです。ミルコが彼の都市に到達しないように詰まっ道路を通じて、最短経路で、数分で、マリカ最も長い期間であるかを調べることができますプログラムを書きます。それぞれの場合において入力、2つの数の最初の行、NおよびMは、町や都市や町の数との間の道路の数、すなわちスペースで区切られました。1≤N≤1000,1≤M≤N*(N-1)/ 2。街に位置し、1からNまでの数字、ミルコ1でマークされたこれらの都市は、市はマリカN.に位置しています 次の3つの図は、カンマで区切られたM行A、B及びV、です。1≤A、B≤N、1≤V≤1000。これらの数字は、都市AとBとの間の双方向の道路が存在することを意味し、それはV-分交差点であってもよいです。出力ファイルの最初の行での出力は、分単位で、最大時間が書かれている、マリカはミルコに到達する必要があるかもしれません。

質問の意味:最短列挙消去、各ポストの最短辺を削除するこれらから、最長と最短の作品を見つけ、しようとしている
問題の解決策:すべての道路がオープン最短パスであるとき、私たちはただ作品を見つける必要があります我々はサイドない最短の道を削除した場合、我々はまだこのものを見つけるたびに最短経路を見つけることがあるためと、このパスにすることができますすべてのエッジを削除することが続きます


#include "stdio.h"
#include "iostream"
#include "string.h"
#include "math.h"
#include "algorithm"
using namespace std;
#define inf 0x3f3f3f3f
int n,m;
int dp[1002][1002],dis[1002],vis[1002];
int pre[1002];
int djk(int x)
{
	memset(vis,0,sizeof(vis));
	for(int i=1;i<=n;i++)
	dis[i]=inf;
	dis[1]=0;
	for(int i=1;i<=n;i++)
	{
		int minn=inf,u;
		for(int j=1;j<=n;j++)
		{
			if(!vis[j]&&minn>dis[j])
			{
				minn=dis[j];
				u=j;
			}
		}
		vis[u]=1;
		for(int j=1;j<=n;j++)
		{
			if(!vis[j]&&dis[j]>dis[u]+dp[u][j])
			{
				dis[j]=dis[u]+dp[u][j];
				if(x)
				pre[j]=u;
			}
		}
	}
	return dis[n];
}
int main()
{
	while(cin>>n>>m&&(n+m))
	{
		memset(pre,0,sizeof(pre));
		for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
		{
			dp[i][j]=inf;
			dp[i][i]=0;
		}
		for(int i=0;i<m;i++)
		{
			int a,b,c;
			cin>>a>>b>>c;
			if(dp[a][b]>c)
			dp[a][b]=dp[b][a]=c;
		}
		int ans=djk(1);
		for(int i=n;i!=1;i=pre[i])
		{
			int t=dp[i][pre[i]];
			dp[i][pre[i]]=dp[pre[i]][i]=inf;
			ans=max(ans,djk(0));
			dp[i][pre[i]]=dp[pre[i]][i]=t;
		}
		printf("%d\n",ans);
	}
}

公開された12元の記事 ウォンの賞賛1 ビュー199

おすすめ

転載: blog.csdn.net/csx_zzh/article/details/105041166