[白俊]1865号虫洞
[白俊]1865号虫洞
1865号:虫洞
これは負の幹線の問題です.
bfsなので悩んでいて、どうしたらいいのか分からない.
最短距離の問題を解決してから長い間、ディエストラは思い出せなかったが、ディエストラではなかった.
初めてベルマンフォード問題に触れた.
実際、ベルマンフォードアルゴリズムはまだすべて理解できない.
対照的に、
今はまだ理解できませんが、個人的には説明が良い文章だと思います.
ベルマンフォードアルゴリズム
まず、最も重要なのは、ベルマンフォードダン、ディックスタワーなどの特定のノードから各ノードへの最短経路を探す方法です.
ベルマンフォードは、その後、ノードの個数がvであれば、v-1回で次のステップを繰り返します.
ベルマンフォードは「負の幹線」による周期の存在を確認できる.上記の繰り返し手順をもう一度実行します.
誰かがこの問題をまとめた。
文章を読む-解答と論争を徹底的に取り除く。
しかしベルマンフォードも完全に理解していなかったので、この文章の中で、私が理解できる部分だけを選んで、再び解いた.
打たれてまた浮かび上がったが、完全に理解できなかった.
この問題。
実施の面で
public class Main {
public static final int TIME_INIT = 10001;
public static int n,m,w; // the number of nodes, edges, holes
public static int[][] matrix = new int[500][500];
//public static List<int[]>[] graph = new ArrayList[500];
public static List<int[]> edges = new ArrayList<>();
public static int[] dist = new int[500];
public static void Setting() throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
int test =0,v1=0,v2=0,c=0;
test = Integer.parseInt(br.readLine());
for(int t=0;t<test;t++){
st = new StringTokenizer(br.readLine());
n = Integer.parseInt(st.nextToken());
m = Integer.parseInt(st.nextToken());
w = Integer.parseInt(st.nextToken());
// init dist table as the start node is 0
Arrays.fill(dist, 0);
// init matrix
for(int i=0;i<n;i++)
Arrays.fill(matrix[i],TIME_INIT);
// get the edge info
for(int e=0;e<m;e++){
st = new StringTokenizer(br.readLine());
v1 = Integer.parseInt(st.nextToken())-1;
v2 = Integer.parseInt(st.nextToken())-1;
c = Integer.parseInt(st.nextToken());
if(matrix[v1][v2]>c) matrix[v1][v2]=c;
if(matrix[v2][v1]>c) matrix[v2][v1]=c;
}
// get the hole info
for(int h=0;h<w;h++){
st = new StringTokenizer(br.readLine());
v1 = Integer.parseInt(st.nextToken())-1;
v2 = Integer.parseInt(st.nextToken())-1;
c = Integer.parseInt(st.nextToken())*(-1);
if(matrix[v1][v2]>c) matrix[v1][v2]=c;
}
boolean res =solve();
if(res) System.out.println("YES");
else System.out.println("NO");
}
}
public static void print(){
System.out.println();
for(int i=0;i<n;i++){
System.out.print(dist[i]+",");
}
}
// if return true --> it has cycle of negative edge
public static boolean solve() {
// n 번 수행하는 것은, 음의간선 순회를 확인하기 위함.
int cur=0,next=0,c=0;
for(int i=0;i<n;i++){
// 모든 간선에 대하여 수행 한다. 간선을
for(int start=0;start<n;start++){
for(int end=0;end<n;end++){
// 이거는 간선이 아님
if(matrix[start][end]==TIME_INIT)continue;
// 갱신이 일어나는 경우
if(dist[end]>(dist[start]+matrix[start][end])){
dist[end]=dist[start]+matrix[start][end];
//print();
if(i == n-1) return true;
}
}
}
}
return false;
}
public static void main(String[] args) throws IOException {
Setting();
}
}
Reference
この問題について([白俊]1865号虫洞), 我々は、より多くの情報をここで見つけました https://velog.io/@ynoolee/백준1865번-웜홀テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol