hdu 2066 한 사람의 여행 최적화 플 로 이 드 알고리즘 해결

혼자 만 의 여행
Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 21056    Accepted Submission(s): 7335
Problem Description
비록 풀 은 길 치 이지 만 (항 저 우 전기 에서 1 년 넘 게 있 었 는데 도 캠퍼스 에서 길 을 잃 은 사람, 땀 ~) 풀 은 여전히 여행 을 좋아 합 니 다. 여행 중 에 많은 사람들 을 만 날 수 있 기 때 문 입 니 다 (백마 탄 왕자, ^ 0 ^)......................................................................................................................................꼭 휴가 를 잘 보 내 고 싶 지만 훈련 을 소홀히 해 서 는 안 됩 니 다. 그래서 풀 은 가장 짧 은 시간 에 가 고 싶 은 곳 으로 가기 로 했 습 니 다. 풀 의 집 은 작은 마을 에 있 고 기차 가 지나 가지 않 았 기 때문에 가 까 운 도시 에 가서 기 차 를 탈 수 밖 에 없 었 습 니 다. (불쌍 합 니 다 ~)
 
Input
입력 데 이 터 는 여러 그룹 이 있 습 니 다. 각 그룹의 첫 줄 은 세 개의 정수 T, S 와 D 입 니 다. T 개의 길이 있 고 초아 집 과 인접 한 도 시 는 S 개 이 며 초아 가 가 고 싶 은 곳 은 D 개 입 니 다.
이 어 T 줄 이 있 고 각 줄 에 세 개의 정수 a, b, time 이 있 으 며 a, b 도시 간 의 차 거 리 는 time 시간 임 을 나타 낸다. (1 = 이 어 진 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
  好忧桑的,,我感觉我明明比discuss里的代码优化多了,,可还是比他耗时多o(╯□╰)o

我wrong了N次,,很难想象,,这么简单的一题。。。。。哎,为了熟悉floyd,真的是拼了。
最起码我明白,,不能用floyd求单源最短路径。。是我自己异想天开了,,也是我没真正弄明白Floyd算法的DP的含义。
还是很有收获的,不过以后刷题,,可能会很少用Floyd了吧。。毕竟O(n^3)的复杂度。。稍微复杂一点的题,,都是超时的命。

代码:

#include 
#include 
#define MAX 1050
#define INF 500000000
int dp[MAX][MAX] ;
bool like[MAX] ;
bool temp[MAX] ;
int min(int a ,int b)
{
	return a>b?b:a ;
}
int main()
{
	int t,s,d;
	while(scanf("%d%d%d",&t,&s,&d) != EOF)
	{
		memset(temp,false,sizeof(temp)) ;
		memset(like,false,sizeof(like)) ;
		for(int i = 0 ; i < MAX ; ++i)
		{
			for(int j = 0 ; j <= i ; ++j)
			{
				dp[i][j] = INF ;
				dp[j][i] = INF ;
			}
		}
		int count = 0 ;
		for(int i = 0 ; i < t ; ++i)
		{
			int x , y , w;
			scanf("%d%d%d",&x,&y,&w) ;
			if(wcount||y>count)
			{
				count = x>y?x:y ;
			}
		}
		int ans = INF ;
		for(int i = 0 ; i < s ; ++i)
		{
			int index ;
			scanf("%d",&index) ;
			temp[index] = true ;
		}
		for(int i = 0 ; i < d ; ++i)
		{
			int index ;
			scanf("%d",&index) ;
			like[index] = true ;
		}
		for(int k = 1 ; k <= count ; ++k)
		{
			for(int i = 1 ; i <= count ; ++i)
			{
				if(dp[i][k] == INF)
				{
					continue ;
				}
				for(int j = 1 ; j <= count ; ++j)
				{
					if(dp[i][j]>dp[i][k]+dp[k][j])
					{
						dp[i][j] = dp[i][k]+dp[k][j] ;
					}
					if(temp[i] && like[j])
					{
						ans = min(dp[i][j] , ans) ; 
					}
				}
			}
		}
		printf("%d
",ans) ; } return 0 ; }

좋은 웹페이지 즐겨찾기