Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

两次DJ,㞎下标竟然打反了嚷昂一次。。。(这题要2000ms干啥?)

Posted by KatrineYang at 2016-09-01 12:45:48 on Problem 3268 and last updated at 2016-09-01 12:46:30
#include <iostream>
#include <stdio.h>
using namespace std;

int adjQuList[1010][1010];
int adjQuDist[1010][1010];
int adjQuNum[1010] = {0};
int adjFeiList[1010][1010];
int adjFeiDist[1010][1010];
int adjFeiNum[1010] = {0};

int main() {
	int N, M, X;
	scanf("%d%d%d", &N, &M, &X);
	for(int i = 0; i < M; i++){
		int from, to, dist;
		scanf("%d%d%d", &from, &to, &dist);
		adjQuList[from][adjQuNum[from]] = to;
		adjQuDist[from][adjQuNum[from]] = dist;
		adjQuNum[from]++;
		adjFeiList[to][adjFeiNum[to]] = from;
		adjFeiDist[to][adjFeiNum[to]] = dist;
		adjFeiNum[to]++;
	}
	int quDist[1010], feiDist[1010];
	for(int i = 1; i <= N; i++){
		quDist[i] = 1000000000;
	}
	for(int j = 1; j <= N; j++){
		feiDist[j] = 1000000000;
	}
	quDist[X] = feiDist[X] = 0;
	bool quUsed[1010] = {0}, feiUsed[1010] = {0};
	for(int i = 1; i <= N; i++){
		int mn = 2147483647, arg = -1;
		for(int j = 1; j <= N; j++){
			if(quUsed[j]) continue;
			if(quDist[j] < mn){
				mn = quDist[j];
				arg = j;
			}
		}
		quUsed[arg] = 1;
		for(int j = 0; j < adjQuNum[arg]; j++){
			if(quUsed[adjQuList[arg][j]]) continue;
			int newDist = quDist[arg] + adjQuDist[arg][j];
			if(newDist < quDist[adjQuList[arg][j]]){
				quDist[adjQuList[arg][j]] = newDist;
			}
		}
	}
	for(int i = 1; i <= N; i++){
		int mn = 2147483647, arg = -1;
		for(int j = 1; j <= N; j++){
			if(feiUsed[j]) continue;
			if(feiDist[j] < mn){
				mn = feiDist[j];
				arg = j;
			}
		}
		feiUsed[arg] = 1;
		for(int j = 0; j < adjFeiNum[arg]; j++){
			if(feiUsed[adjFeiList[arg][j]]) continue;
			int newDist = feiDist[arg] + adjFeiDist[arg][j];
			if(newDist < feiDist[adjFeiList[arg][j]]){
				feiDist[adjFeiList[arg][j]] = newDist;
			}
		}
	}
	int mx = 0;
	for(int i = 1; i <= N; i++){
		int tmp = quDist[i] + feiDist[i];
		if(tmp > mx) mx = tmp;
	}
	printf("%d\n", mx);
	return 0;
}

Followed by:

Post your reply here:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator