블 루 브리지 컵알고리즘 증가도로 와 항로 (전형 적 인 SPFA 알고리즘 문제)
9233 단어 알고리즘
입력 형식 입력 의 첫 줄 에는 빈 칸 으로 구 분 된 네 개의 정수 T, R, P, S 가 포함 되 어 있 습 니 다.그 다음 에 R 행 은 도로 정 보 를 묘사 하고 줄 마다 세 개의 정 수 를 포함 하 며 각각 Ai, Bi 와 Ci 를 나타 낸다.그 다음 에 P 행 은 항로 정 보 를 묘사 하고 줄 마다 세 개의 정 수 를 포함 하 며 각각 Ai, Bi 와 Ci 를 나타 낸다.
출력 형식 출력 T 줄 은 도시 S 에서 도시 마다 최소 비용 을 표시 하고 도착 하지 않 으 면 NO PATH 를 출력 합 니 다.샘플 입력 6, 3, 4, 1, 2, 5, 5, 6, 10, 4, 6 - 100, 1, 3 - 10 샘플 출력 NO PATH NO PATH 5 0 - 95 - 100 데이터 규모 와 약정 에 대한 20% 데이터, T < = 100, R < = 500, P < = 500;30% 의 데이터 에 대해 R < = 1000, R < = 10000, P < = 3000;100% 의 데이터 에 대해 서 는 1 & lt; = T & gt; = 25000, 1 & gt; = R & gt; = 50000, 1 & gt; = P & gt; = 50000.
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Scanner;
/** * @author * */
public class Main {
private static int max=10000000;
private static int T;// ( )
private static int R;// ( )
private static int P;// ( )
private static int S;// ( )
private static int[] dist;//// 1
private static Node[] node;//
private static ArrayDeque<Integer> queue=new ArrayDeque<Integer>();
/** * @param args */
public static void main(String[] args) {
// TODO Auto-generated method stub
init();
spfa();
print();
}
private static void print(){
for(int i=1;i<=T;i++){
if(dist[i]<max){
System.out.println(dist[i]);
}else{
System.out.println("NO PATH");
}
}
}
private static void init(){
Scanner sc=new Scanner(System.in);
T=sc.nextInt();
R=sc.nextInt();
P=sc.nextInt();
S=sc.nextInt();
dist=new int[T+1];
node=new Node[T+1];
for(int i=1;i<=T;i++){
dist[i]=max;
node[i]=new Node();
}
dist[S]=0;
queue.add(S);
for(int i=0;i<R;i++){
int from=sc.nextInt();
int to=sc.nextInt();
int weight=sc.nextInt();
node[from].list.add(to);
node[from].weight.add(weight);
node[to].list.add(from);
node[to].weight.add(weight);
}
for(int i=0;i<P;i++){
int from=sc.nextInt();
int to=sc.nextInt();
int weight=sc.nextInt();
node[from].list.add(to);
node[from].weight.add(weight);
}
sc.close();
}
//
//1.
//2.
//
// : d INF( );p s( ), -1, d[s]=0;
// , 0。 ;( vis , )
//
// +
// u, u ( ); u v , ( d[v] ), ,
// , v , v ( ), ,
// ,
//
//SPFA
// : , SPFA 。
// :
// , 。 , v d[v] 。
// d 。 , 。
// , , d , , ,
// 。( )
// O(ke), k , k 2。
/** private static void spfa(){ while(queue.size()!=0){ // u, u ( ); // u v , ( d[v] ), , // , v , v ( ), , // , int queFir=queue.poll(); for(int i=0;i<node[queFir].list.size();i++){ int t=node[queFir].list.get(i); int weight=node[queFir].weight.get(i); if(dist[queFir]+weight<dist[t]){ dist[t]=dist[queFir]+weight; path[t]=queFir; if(!queue.contains(t)){ queue.offer(t); } } } } } */
private static void spfa(){
while(queue.size()!=0){
int queueFir=queue.poll();
for(int i=0;i<node[queueFir].list.size();i++){
int v=node[queueFir].list.get(i);
int weight=node[queueFir].weight.get(i);
if(dist[queueFir]+weight<dist[v]){
dist[v]=dist[queueFir]+weight;
if(!queue.contains(v)){
queue.offer(v);
}
}
}
}
}
}
class Node{
ArrayList<Integer> list=new ArrayList<Integer>();
ArrayList<Integer> weight=new ArrayList<Integer>();
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
【Codility Lesson3】FrogJmpA small frog wants to get to the other side of the road. The frog is currently located at position X and wants to get to...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.