[プログラマー]level-3位(floydとshallアルゴリズム)
22192 ワード
順位をつける
プログラマーがランキングの問題に遭遇
これはフロイドとシエルアルゴリズムを用いた問題である.
フロイドとシエルが何なのかを知り、解いてみよう~!
羅東彬のアルゴリズムのビデオ
マルチアウトアルゴリズム:1つの頂点からすべての頂点への最短パス
floodとshall:すべての頂点からすべての頂点への最短パス
値は の2次元配列(書き出しという名前の1次元配列) に格納されると考えられる. x->yのコストは、x->ノード1+ノード1->yの合計コストよりも低い 更新
まず
1~5つのノードがあると報告されていますが、資料を並べてみましょう.は全部で100人の選手が 人います.勝/敗なのでブール配列
今思い出して正解を探すロジック
aがbに勝てば,bがcに勝てば,aがcに勝つと見なすことができる.
その三重砲口を撃った後.
選手一人一人が勝つかどうかを知ることができる.
自分のn-1番の勝敗以外は影響を受けていればいい
勝負は重要ではなく、勝負の有無に影響力がある.完全コード
プログラマーがランキングの問題に遭遇
これはフロイドとシエルアルゴリズムを用いた問題である.
フロイドとシエルが何なのかを知り、解いてみよう~!
羅東彬のアルゴリズムのビデオ
マルチアウトアルゴリズム:1つの頂点からすべての頂点への最短パス
floodとshall:すべての頂点からすべての頂点への最短パス
値は
#include <string>
#include <vector>
using namespace std;
int number = 4;
int INF = 100000000;
//자료 배열 초기화 ( i > j 거리)
int a[4][4] = {
{0, 5, INF, 8},
{7, 0, 9, INF},
{2, INF, 0, 4},
{INF, INF, 3, 0}
};
void floydWarchall() {
//결과 그래프 초기화
int d[number][number];
for(int i = 0; i < number; i++) {
for (int j = 0; j < number; j++) {
d[i][j] = a[i][j];
}
}
//3중포문으로 구현
//k = 거쳐가는 노드
for (int k = 0; k < number; k++) {
//i는 출발노드
for (int i = 0; i < number; i++) {
//j는 도착노드
for (int j = 0; j < number; j++) {
// 갱신
if (d[i][k] + d[k][j] < d[i][j]) {
d[i][j] = d[i][k] + d[k][j];
}
}
}
}
}
プログラマーの問題に適用しましょう.まず
1~5つのノードがあると報告されていますが、資料を並べてみましょう.
bool a[101][101];
int solution(int n, vector<vector<int>> results) {
int answer = 0;
for (int i = 0; i < results.size(); i++) {
int x = result[i][0];
int y = result[i][1];
//x 가 y를 이김
a[x][y] = true;
}
return answer;
}
あなたが学んだことをあなたに適用するとfor(int k = 1; k <= n; k++) {
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
if (a[i][k] && a[k][j]) {
//a[i][j] = a[i][k] + a[k][j];
a[i][j] = true;
}
}
}
}
このような三重複文が現れる今思い出して正解を探すロジック
aがbに勝てば,bがcに勝てば,aがcに勝つと見なすことができる.
その三重砲口を撃った後.
選手一人一人が勝つかどうかを知ることができる.
自分のn-1番の勝敗以外は影響を受けていればいい
この問題に適用する場合,最大値を算出して更新するよりも,過去への影響力が真/偽値であるか,+追加すると,1人当たりn−1の結果が得られることを理解すべきである.
勝負は重要ではなく、勝負の有無に影響力がある.
#include <string>
#include <vector>
using namespace std;
bool a[101][101];
int solution(int n, vector<vector<int>> results) {
int answer = 0;
for (int i = 0; i < results.size(); i++) {
int x = results[i][0];
int y = results[i][1];
//x 가 y를 이김
a[x][y] = true;
}
for(int k = 1; k <= n; k++) {
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
if (a[i][k] && a[k][j]) {
//a[i][j] = a[i][k] + a[k][j];
a[i][j] = true;
}
}
}
}
for (int i = 1; i <= n; i++) {
int count = 0;
for (int j = 1; j <= n; j++) {
if (a[i][j] || a[j][i]) count++;
}
if (count == n - 1) answer++;
}
return answer;
}
Reference
この問題について([プログラマー]level-3位(floydとshallアルゴリズム)), 我々は、より多くの情報をここで見つけました https://velog.io/@isntkyu/프로그래머스level-3-순위-플로이드-와샬-알고리즘テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol