ν°μ€ν 리 λ·°
Programming/μκ³ λ¦¬μ¦
[λ°©ν₯κ·Έλν] μμμμ in-degree (μ§μ μ°¨μ) μ΄μ©ν΄μ ꡬνκΈ°
ν΄λμκ·Έ 2021. 12. 7. 04:46- λ°©ν₯κ·Έλν G
- λ°©ν₯ λΉμΈμ΄ν΄ κ·Έλν(directed acyclic graph: DAG)λ©΄ μμμμ(topologicalorder)λ₯Ό κ΅¬ν΄ μΈμ
- Gμ λ°©ν₯ μΈμ΄ν΄(directed cycle)μ΄ μ‘΄μ¬νλ©΄ μμμμλ₯Ό ꡬν μ μμΌλ―λ‘ 0μ μΈμ
- μΈμ 리μ€νΈ κ΅¬μ‘°λ‘ νν && λ°°μ΄λ‘ ꡬν
- in-degree (μ§μ μ°¨μ) μ΄μ©ν΄μ μμμμ ꡬνκΈ°
- μμμμλ₯Ό ꡬνλ κ³Όμ μμ λ°©ν₯μΈμ΄ν΄μ μ‘΄μ¬ μ¬λΆ νμΈ
- κ·Έλνμ λν μμμμλ μ¬λ¬ κ° μμ μ μμ§λ§, μλ μ½λμμλ λ¨ ν κ°μ μμμμλ§ μΆλ ₯ κ°λ₯νλλ‘
# include <stdio.h>
# include <stdlib.h>
# pragma warning(disable:4996)
int n, m;
int* in;
int* topOrder;
int* queue;
int queueSize = -1;
int queueIsEmpty() {
if (queueSize == -1)
return 1;
else
return 0;
}
void enQueue(int data) {
queueSize++;
queue[queueSize] = data;
}
int deQueue() {
if (queueIsEmpty())
return -1;
int tmp = queue[0];
for (int i = 0; i < queueSize; i++)
queue[i] = queue[i + 1];
queueSize--;
return tmp;
}
typedef struct node {
int elem;
struct node* next;
}NODE;
typedef struct edge {
int origin;
int destination;
}EDGE;
typedef struct vertex {
char name;
int inDegree;
struct node* outEdges;
struct node* inEdges;
}VERTEX;
NODE* getNode() {
NODE* newNode = (NODE*)malloc(sizeof(NODE));
newNode->next = NULL;
return newNode;
}
struct graph {
VERTEX vertices[100];
EDGE edges[1000];
}G;// λ°©ν₯κ·Έλν
int findindex(char vname) {
for (int i = 0; i < n; i++) {
if (G.vertices[i].name == vname)
return i;
}
return -1;
}
void insertFisrt(NODE* H, int i) {
NODE* newNode = getNode();
newNode->elem = i;
newNode->next = H->next;
H->next = newNode;
return;
}
void insertVertex(char vname, int i) {
G.vertices[i].name = vname;
G.vertices[i].inDegree = 0;
G.vertices[i].inEdges = getNode();
G.vertices[i].outEdges = getNode();
}
void insertDirectedEdge(char uname, char wname, int i) {
int u = findindex(uname);
int w = findindex(wname);
G.edges[i].origin = u;
G.edges[i].destination = w;
insertFisrt(G.vertices[u].outEdges, i);
insertFisrt(G.vertices[w].inEdges, i);
G.vertices[w].inDegree++;
return;
}
void buildGraph() {
scanf("%d", &n);
getchar();
topOrder = (int*)malloc(sizeof(int) * (n + 1));
queue = (int*)malloc(sizeof(int) * n);
in = (int*)malloc(sizeof(int) * n);
char vname;
for (int i = 0; i < n; i++) {
scanf("%c", &vname);
insertVertex(vname, i);
getchar();
}
scanf("%d", &m);
getchar();
char uname, wname;
for (int i = 0; i < m; i++) {
scanf("%c %c", &uname, &wname);
getchar();
insertDirectedEdge(uname, wname, i);
}
return;
}
void topologicalSort() {
int t = 1;
int u, w;
for (int i = 0; i < n; i++)
queue[i] = 0;
for (int i = 0; i < n; i++) {
in[i] = G.vertices[i].inDegree;
if (in[i] == 0)
enQueue(i);// in_degreeκ° 0μ΄λ©΄ νμ μ μ μΆκ°
}
while (!queueIsEmpty()) {// νκ° λΉ λκΉμ§
u = deQueue();// νμ μ μμλ₯Ό Tλ‘ κ°μ Έμμ append
topOrder[t] = u;
t++;
NODE* tmp = G.vertices[u].outEdges->next;
while (tmp != NULL) {// dequeue()ν μ μ μ μΈμ ν μ μ μ€ λ°©λ¬Ένμ§ μμ μ μ μ in_degreeλ₯Ό νλ κ°μ
w = G.edges[tmp->elem].destination;
in[w]--;
if (in[w] == 0)// in_degree κ°μ ν κ°μ΄ 0μ΄λ©΄ ν΄λΉ μ μ μ queueμ enqueue() νκ³ λ°©λ¬Έν κ²μΌλ‘ νμ
enQueue(w);
tmp = tmp->next;
}
}
if (t < n + 1)
topOrder[0] = 0;
else
topOrder[0] = 1;
return;
}
int main() {
buildGraph();
topologicalSort();
if (topOrder[0] == 0) {
printf("0\n");
}
else {
for (int i = 1; i <= n; i++)
printf(" %c", G.vertices[topOrder[i]].name);
}
return 0;
}
λ°μν
'Programming > μκ³ λ¦¬μ¦' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[μ΅μμ μ₯νΈλ¦¬] Prim-Jarnik μκ³ λ¦¬μ¦, Kruskal μκ³ λ¦¬μ¦ (0) | 2021.12.07 |
---|---|
[κ·Έλνμν] (0) | 2021.12.07 |
[κ·Έλν] μΈμ 리μ€νΈ, μΈμ νλ ¬ (무방ν₯) (0) | 2021.12.07 |
[ν΄μν μ΄λΈ] (0) | 2021.11.22 |
[νμνΈλ¦¬] μ΄μ§νμνΈλ¦¬ (0) | 2021.10.20 |
곡μ§μ¬ν
μ΅κ·Όμ μ¬λΌμ¨ κΈ
μ΅κ·Όμ λ¬λ¦° λκΈ
- Total
- Today
- Yesterday
λ§ν¬
TAG
- CμΈμ΄
- AIRUSH2023
- lgaimers
- λ Όλ¬Έλ¦¬λ·°
- μ½ν μ€λΉ
- SKTECHSUMMIT
- μ€ν μ΄λΈλν¨μ
- StableDiffusion
- dreambooth
- HyperCLOVA
- ꡬκΈμ½λ©
- MYSQL
- SQL
- μ½λ©κ³΅λΆ
- λλ¦ΌλΆμ€
- λ Όλ¬Έμ½κΈ°
- κΈ°μ 컨νΌλ°μ€
- Aimers
- AI컨νΌλ°μ€
- νμ΄μ¬μ½ν
- WGAN
- CLOVAX
- DALLE
- ν ν¬μλ°
- AIRUSH
- μ½λ©μλ¬
- νλ‘κ·Έλλ¨Έμ€
- νμ΄μ¬
- gan
- μ½ν
μΌ | μ | ν | μ | λͺ© | κΈ | ν |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | |
7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 29 | 30 | 31 |
κΈ λ³΄κ΄ν¨