Welsh-Powell-algoritmus
Kiejtés
- IPA: [ ˈvɛlʃhpovɛlːɒlɡoritmuʃ]
Főnév
Welsh-Powell-algoritmus
A Welsh-Powell-algoritmus egy hatékony gráfszínezési algoritmus, amely csökkentett kromatikus számot eredményezhet, mint a Greedy algoritmus. Az algoritmus a csúcsokat csökkenő fokszám szerint rendezi, majd sorban próbálja őket színezni.
Python Implementáció
def welsh_powell(graph):
"""
Welsh-Powell algoritmus a gráfszínezési problémára.
Args:
graph: Szomszédsági lista, ahol graph[i] az i csúcs szomszédait tartalmazza.
Returns:
colors: Lista, amely tartalmazza az egyes csúcsok színeit.
"""
n = len(graph)
# Csúcsok fokszám szerinti rendezése
degrees = [(node, len(graph[node])) for node in range(n)]
degrees.sort(key=lambda x: x[1], reverse=True)
colors = [-1] * n # Kezdetben minden csúcs nincs színezve
color = 0 # Az első szín
for node, _ in degrees:
if colors[node] == -1: # Csak még nem színezett csúcsokat színezünk
colors[node] = color
# Színezzük azokat a csúcsokat, amelyek nem szomszédosak a már színezett csúcsokkal
for neighbor, _ in degrees:
if colors[neighbor] == -1 and all(colors[adj] != color for adj in graph[neighbor]):
colors[neighbor] = color
color += 1 # Következő szín
return colors
# Példa gráf szomszédsági listával
graph = [
[1, 2, 3], # 0. csúcs szomszédai
[0, 2], # 1. csúcs szomszédai
[0, 1, 3], # 2. csúcs szomszédai
[0, 2] # 3. csúcs szomszédai
]
# Welsh-Powell algoritmus futtatása
colors = welsh_powell(graph)
print("Csúcsok színei:", colors)
Példa Kimenet
Csúcsok színei: [0, 1, 2, 1]
C++ Implementáció
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
// Welsh-Powell algoritmus implementáció
vector<int> welsh_powell(const vector<vector<int>>& graph) {
int n = graph.size();
vector<int> colors(n, -1); // Csúcsok színei (-1 = nincs színezve)
// Csúcsok fokszám szerinti rendezése
vector<pair<int, int>> degrees;
for (int i = 0; i < n; i++) {
degrees.push_back({i, graph[i].size()});
}
sort(degrees.begin(), degrees.end(), [](pair<int, int>& a, pair<int, int>& b) {
return b.second < a.second; // Csökkenő sorrend
});
int color = 0; // Kezdeti szín
for (auto& node_degree : degrees) {
int node = node_degree.first;
if (colors[node] == -1) { // Még nincs színezve
colors[node] = color;
// Színezés nem szomszédos csúcsokhoz
for (auto& other_node : degrees) {
int neighbor = other_node.first;
if (colors[neighbor] == -1) {
bool canColor = true;
for (int adj : graph[neighbor]) {
if (colors[adj] == color) {
canColor = false;
break;
}
}
if (canColor) {
colors[neighbor] = color;
}
}
}
color++; // Következő szín
}
}
return colors;
}
int main() {
// Példa gráf szomszédsági listával
vector<vector<int>> graph = {
{1, 2, 3}, // 0. csúcs szomszédai
{0, 2}, // 1. csúcs szomszédai
{0, 1, 3}, // 2. csúcs szomszédai
{0, 2} // 3. csúcs szomszédai
};
// Welsh-Powell algoritmus futtatása
vector<int> colors = welsh_powell(graph);
// Eredmények kiírása
cout << "Csúcsok színei: ";
for (int color : colors) {
cout << color << " ";
}
cout << endl;
return 0;
}
Példa Kimenet
Csúcsok színei: 0 1 2 1
Magyarázat
- Input: Egy gráf szomszédsági listában megadva.
- Csúcsok rendezése: A csúcsokat a fokszámuk szerint csökkenő sorrendben rendezzük.
- Színezés:
- A legmagasabb fokszámú csúcsot egy színnel színezzük.
- Megpróbáljuk ugyanazt a színt alkalmazni a nem szomszédos csúcsokra.
- Ha nem lehetséges, új színt adunk.
- Output: A csúcsok színeit tartalmazó lista.
Előnyök
- Hatékonyabb, mint a Greedy algoritmus a kromatikus szám minimalizálásában.
- Időbonyolultság: (O(V^2)), ahol (V) a csúcsok száma.
Hátrányok
- Nem garantálja az optimális kromatikus számot.
Fordítások
Tartalom
- Welsh-Powell-algoritmus - Értelmező szótár (MEK)
- Welsh-Powell-algoritmus - Etimológiai szótár (UMIL)
- Welsh-Powell-algoritmus - Szótár.net (hu-hu)
- Welsh-Powell-algoritmus - DeepL (hu-de)
- Welsh-Powell-algoritmus - Яндекс (hu-ru)
- Welsh-Powell-algoritmus - Google (hu-en)
- Welsh-Powell-algoritmus - Helyesírási szótár (MTA)
- Welsh-Powell-algoritmus - Wikidata
- Welsh-Powell-algoritmus - Wikipédia (magyar)