1. 선정 과정 (selection procedure)
2. 적정성 점검 (feasibility check)
3. 해답 점검 (solution check)
1. Y = {V1}
touch
2 | 3 | 4 | 5 |
1 | 1 | 1 | 1 |
length
2 | 3 | 4 | 5 |
7 | 4 | 6 | 1 |
2. Y = {V1, V5}
touch
2 | 3 | 4 | 5 |
1 | 1 | 5 | 1 |
length
2 | 3 | 4 | 5 |
7 | 4 | 2 | -1 |
3. Y = {V1, V5, V4}
touch
2 | 3 | 4 | 5 |
4 | 1 | 5 | 1 |
length
2 | 3 | 4 | 5 |
5 | 4 | -1 | -1 |
4. Y = {V1, V5, V4, V3}
touch
2 | 3 | 4 | 5 |
4 | 1 | 5 | 1 |
length
2 | 3 | 4 | 5 |
5 | -1 | -1 | -1 |
4. Y = {V1, V5, V4, V3, V2}
touch
2 | 3 | 4 | 5 |
4 | 1 | 5 | 1 |
length
2 | 3 | 4 | 5 |
-1 | -1 | -1 | -1 |
void dijkstra(int n, const number W[][], EdgeSet& F){
index i, vnear, touch[2..n];
edge e;
number length[2..n];
int min;
F = ∅;
for(i=2; i<=n; i++){ touch[i] = 1; length[1] = W[1][i]; } // 초기화
for(j=1; j <= n-1; j++){
min = ∞;
for(i=2; i<=n; i++)
if(0<=length[i]<min){ min = length[i]; vnear = i; } // 가장 가까운 정점 찾음
e = (touch[vnear], vnear);
F = F ∪ {e};
for(i=2; i<=n; i++){
if(length[vnear]+W[vnear][i] < length[i]){ // vnear 경유할 때 더 최단경로이면
length[i] = length[vnear] + W[vnear][i];
touch[i] = vnear; // 경유해서 가는 정점
}
length[vnear] = -1 // 방문한 정점은 -1로 표시
}
}
}
int GreedyKnapsack(float M, int n, int p[], int w[], int& x[]){
for(int i=1; i<=n; i++) x[i] = 0.0;
float U = M;
for(i=1; i<=n; i++){
if(w[i] > U) break;
x[i] = 1.0; // 무게 넘지 않으면 배낭에 넣음
U -= w[i]; // 배낭에 수용 가능한 무게 갱신
}
if(i <= n) x[i] = U/w[i]; // 아이템 남았으면 쪼개서 넣는다.
}
struct treenode{
struct treenode *lchild, *rchild;
int weight;
};
typedef struct treenode Type;
Type *Tree(int n){
for(int i=1; i<=n-1; i++){
Type *pt = new Type;
// Get a new tree node
pt->lchild = Least(list);
pt->rchild = Least(list);
// merge two trees with smallest lengths
pt->weight = (pt->lchild)->weight + (pt->rchild)->weight;
Insert(list, *pt);
}
return (Least(list)); // 루트 노드 반환
}
struct nodetype{
char symbol; // value of character
int frequency; // 파일에서 숫자 빈도
nodetype* left;
nodetype* right;
}
nodetype Huffman(struct nodetype charSet[], int n){
for(i=1; i<=n; i++) Insert(PQ, charSet[i]);
for(i=1; i<=n-1; i++){
p = remove(PQ);
q = remove(PQ);
r = new nodetype;
r->left = p;
r->right = q;
r->frequency = p->frequency + q->frequency;
insert(PQ, r);
}
return remove(PQ);
}
[Softeer] 근무 시간 (C++) (0) | 2023.03.28 |
---|---|
[알고리즘] Backtracking (백트래킹) (0) | 2022.01.08 |
[알고리즘] Greedy Algorithm (1) (0) | 2022.01.08 |
[백준(BOJ)] 11656번: 접미사 배열 (C++) (0) | 2021.08.30 |
[백준(BOJ)] 10824번: 네 수 (C++) (0) | 2021.08.30 |