07 - 그림 6 관광 계획 (Dijkstra 알고리즘 (단원 최 단 경로 알고리즘))

15448 단어 PTA
Dijkstra 알고리즘
"단일 소스 최 단 경로" 문제, 두 점 사이 의 최 단 경 로 를 찾 습 니 다.
07 - 그림 6 관광 계획
자가 운전 여행 노선 도 를 보면 도시 간 고속도로 길이 와 이 도로 에서 받 아야 할 통행 료 를 알 수 있 을 것 이다.지금 은 상담 하 러 온 관광객 들 이 출발지 와 목적지 사이 의 가장 짧 은 경 로 를 찾 을 수 있 도록 프로그램 을 써 야 한다.만약 몇 개의 경로 가 모두 가장 짧다 면, 가장 싼 경 로 를 출력 해 야 한다.
입력 형식:
입력 설명: 입력 데이터 의 첫 번 째 줄 은 4 개의 정수 N, M, S, D 를 제시 합 니 다. 그 중에서 N (2 ≤ N ≤ 500) 은 도시 의 개수 이 고 도시 의 번호 가 0 이 라 고 가정 합 니 다 ~ (N - 1).M 은 고속도로 의 개수 이다.S 는 출발지 의 도시 번호 이다.D 는 목적지 의 도시 번호 다.그 다음 에 M 줄 에서 각 줄 은 고속도로 정 보 를 주 었 는데 그것 이 바로 도시 1, 도시 2, 고속도로 길이, 요금 액 이다. 중간 에 빈 칸 으로 나 누 면 숫자 는 모두 정수 이 고 500 을 초과 하지 않 는 다.보증 해 의 존 재 를 입력 하 십시오.
출력 형식:
한 줄 에서 출력 경로 의 길이 와 비용 총액 은 숫자 간 에 빈 칸 으로 구분 되 며 출력 끝 에 빈 칸 이 있어 서 는 안 됩 니 다.
입력 예시:
4 5 0 3
0 1 1 20
1 3 2 30
0 3 4 10
0 2 2 20
2 3 1 20

출력 예시:
3 40

코드
#include
using namespace std;
#define Maxn 1000

int a[550][550];
int s[550][550];
int d[550];
int f[550];
int visited[550]={0};
int v,b,n,m;
void Dijkstra(int x){
	for(int i=0;i<v;i++){	// 0 i                 
		d[i]=a[x][i];
		f[i]=s[x][i];
	}
	visited[x]=1;	//      
	d[x]=0,f[x]=0;	 

	for(int i=1;i<v;i++){
		int tail,j,mm=Maxn;
		for(j=0;j<v;j++){	//         
			if(!visited[j]&&d[j]<mm){
				mm=d[j];
				tail=j;
			}
		}
		visited[tail]=1;
		
		for(j=0;j<v;j++){
			if(!visited[j]){
				if(d[tail]+a[tail][j]<d[j]){	//     
					d[j]=d[tail]+a[tail][j];
					f[j]=f[tail]+s[tail][j];
				}else if(d[tail]+a[tail][j]==d[j]	//     
				&&f[tail]+s[tail][j]<f[j]){
					f[j]=f[tail]+s[tail][j];
				} 
			}
		}
	}
}
int main(){
	cin>>v>>b>>n>>m;
	for (int i = 0; i < v; i++)	//              
    for (int j = 0; j < v; j++) {
        a[i][j] = Maxn;
        s[i][j] = Maxn;
    }
	int q,w,e,r;
	for(int i=1;i<=b;i++){	//     
		cin>>q>>w>>e>>r;
		a[q][w]=a[w][q]=e;
		s[q][w]=s[w][q]=r;
	}
	Dijkstra(n);	//Dijkstra   
	cout<<d[m]<<" "<<f[m];
	return 0;
} 

좋은 웹페이지 즐겨찾기