HDoj 2066一人旅

4578 ワード

一人旅
Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 22516    Accepted Submission(s): 7816
Problem Description
草児は方向音痴(杭電に1年以上いたのに、キャンパスで道に迷った人、汗~)でしたが、草児は旅行が大好きで、旅の途中でたくさんの人に会えるので(白馬王子、^0^)ああ、いろいろなことがあって、自分の経験を豊かにすることができて、また美しい景色を见ることができます......草は多くの地方に行きたいです.彼女は东京タワーに行って夜景を见に行きたいです.ベネチアに行って映画を见に行きます.阳明山に行って芋を见に行きます.ニューヨークに行って雪の景色を见に行きます.パリに行ってコーヒーを饮んで手纸を书きます.北京に行って孟姜女を见舞いに行きます.冬休みが近づいています.ちゃんと休みを取ってあげなきゃいけないんだけど、訓練をおろそかにしちゃいけないんだから、草は一番短い時間で行きたいところに行くことにしたんだよ.草の家は小さな町にあって列車が通っていないから、隣の町に行って列車に乗るしかないんだよ(かわいそう~).
 
 
Input
入力データには複数のグループがあり、各グループの最初の行は3つの整数T、S、Dであり、T本の道があり、草の家と隣接する都市にはS個、草の行きたい場所にはD個があることを示している.
次にT行があり、各行に3つの整数a,b,timeがあり、a,b都市間の車の距離がtime時間であることを示す.(1=<(a,b)<=1000;a,b間に複数の道がある可能性がある)
続くT+1行目にはS個数があり、草児家とつながっている都市を表す.
次のT+2行目にD個の数があり、草が地方に行きたいことを表す.
 
 
Output
草を出してある好きな都市に行ける最短時間.
 
 
Sample Input
6 2 3
1 3 5
1 4 7
2 8 12
3 8 4
4 9 12
9 10 2
1 2
8 9 10
 
 
Sample Output
9
dijkstraアルゴリズム:ACコード
 
#include<stdio.h>

#include<string.h>

#define MAX 1000+100

#define INF 0x3f3f3f 

#define da(a,b)(a>b?a:b)

int s,d;

int low[MAX],visit[MAX],map[MAX][MAX];

int lian[MAX],want[MAX];

int maxn;

void dijkstra(int start,int city)

{

	    int i,j,next,min,l,xiao,k=0;

	    memset(visit,0,sizeof(visit));	     

	    for(i=1;i<=city;i++)

	    {

		    low[i]=map[start][i];

	    }

	    visit[start]=1;

	    for(i=2;i<=city;i++)

	    {

	    	min=INF;

	    	for(j=1;j<=city;j++)

	    	{

	    		if(!visit[j]&&min>low[j])

	    		{

	    			min=low[j];

	    			next=j;

	    		}

	    	}

	    	visit[next]=1;

	    	for(j=1;j<=city;j++)

	    	{

	    		if(!visit[j]&&low[j]>low[next]+map[next][j])

	    		low[j]=low[next]+map[next][j];

	    	}

	    }

} 

int main()

{

	int road,i,j,a,b,time,mintime;

	while(scanf("%d%d%d",&road,&s,&d)!=EOF)

	{

		for(i=1;i<MAX;i++)

		{

			for(j=1;j<MAX;j++)

			{

				if(i==j)

				map[i][j]=0;

				else

				map[i][j]=INF;

			}

		}

		maxn=0;

		while(road--)

		{

			scanf("%d%d%d",&a,&b,&time);

		    if(maxn<da(a,b))

		    maxn=da(a,b);

			if(map[a][b]>time)

			map[a][b]=map[b][a]=time;

		}

		for(i=1;i<=s;i++)

		scanf("%d",&lian[i]);

		for(i=1;i<=d;i++)

		scanf("%d",&want[i]);

		mintime=INF;

		for(i=1;i<=s;i++)

		{

			dijkstra(lian[i],maxn);

			for(j=1;j<=d;j++)

			{

				if(mintime>low[want[j]])

				mintime=low[want[j]];			

			}

		}

		printf("%d
",mintime); } return 0; }

なぜか上のコードは判断の最小のステップを主関数に入れることで 下のこの判断の最小のステップを子関数の中に入れてずっとruntime error、見たことがある大神が弟を助けて解答することを望んでありがとうございます、下の辺は問題のコードを添付します:
#include<stdio.h>

#include<string.h>

#define MAX 1000+100

#define INF 0x3f3f3f 

#define da(c,d)(c>d?c:d)

int s,d;

int low[MAX],visit[MAX],map[MAX][MAX];

int lian[MAX],want[MAX],lowdis[1010000];

int maxn;

void dijkstra()

{

	int i,j,next,min,l,xiao,k=0,mintime=INF;

	memset(lowdis,0,sizeof(lowdis));

	for(l=1;l<=s;l++)

	{

	    memset(visit,0,sizeof(visit));	     

	    for(i=1;i<=maxn;i++)

	    {

		    low[i]=map[lian[l]][i];

	    }

	    visit[lian[l]]=1;

	    for(i=2;i<=maxn;i++)

	    {

	    	min=INF;

	    	for(j=1;j<=maxn;j++)

	    	{

	    		if(!visit[j]&&min>low[j])

	    		{

	    			min=low[j];

	    			next=j;

	    		}

	    	}

	    	visit[next]=1;

	    	for(j=1;j<=maxn;j++)

	    	{

	    		if(!visit[j]&&low[j]>low[next]+map[next][j])

	    		low[j]=low[next]+map[next][j];

	    	}

	    }	    

	    for(j=1;j<=d;j++)

	    {

	    	if(mintime>low[want[j]])

	    	mintime=low[want[j]];

	    }

	}	

	printf("%d
",mintime); } int main() { int road,i,j,a,b,time; while(scanf("%d%d%d",&road,&s,&d)!=EOF) { for(i=1;i<MAX;i++) { for(j=1;j<MAX;j++) { if(i==j) map[i][j]=0; else map[i][j]=INF; } } maxn = 0; while(road--) { scanf("%d%d%d",&a,&b,&time); if(maxn<da(a,b)) maxn=da(a,b); if(map[a][b]>time) map[a][b]=map[b][a]=time; } for(i=1;i<=s;i++) scanf("%d",&lian[i]); for(i=1;i<=d;i++) scanf("%d",&want[i]); dijkstra(); } return 0; }