Ranking (as of 2013-03-24): 292
Language: C++
/*
UVa 193 - Graph Coloring
To build using Visual Studio 2008:
cl -EHsc -O2 graph_coloring.cpp
*/
#include <iostream>
#include <vector>
using namespace std;
void graph_coloring(int n, int ni, const vector< vector<int> >& adjacency_list,
int nr_black_nodes, vector<bool>& black_nodes,
int& max_nr_black_nodes, vector<bool>& max_black_nodes)
{
if (ni == n) {
if (nr_black_nodes > max_nr_black_nodes) {
max_nr_black_nodes = nr_black_nodes;
#ifdef DEBUG
cout << max_nr_black_nodes << endl;
#endif
for (int i = 0; i < n; i++)
max_black_nodes[i] = black_nodes[i];
}
}
else if (nr_black_nodes + n - ni <= max_nr_black_nodes)
return;
else {
const vector<int>& al = adjacency_list[ni];
if (al.empty()) {
black_nodes[ni] = true; // color ni-th node black
graph_coloring(n, ni + 1, adjacency_list, nr_black_nodes + 1, black_nodes,
max_nr_black_nodes, max_black_nodes);
}
else {
size_t i = 0, e = al.size();
for ( ; i < e; i++)
if (black_nodes[al[i]])
break;
if (i == e) { // all of the connected nodes are white
black_nodes[ni] = true;
graph_coloring(n, ni + 1, adjacency_list, nr_black_nodes + 1, black_nodes,
max_nr_black_nodes, max_black_nodes);
black_nodes[ni] = false;
}
// color ni-th node white
graph_coloring(n, ni + 1, adjacency_list, nr_black_nodes, black_nodes,
max_nr_black_nodes, max_black_nodes);
}
}
}
int main()
{
int m;
cin >> m;
while (m--) {
int n, k;
cin >> n >> k;
vector< vector<int> > adjacency_list(n, vector<int>()); // adjacency list
for (int i = 0; i < k; i++) {
int u, v;
cin >> u >> v;
u--; v--;
adjacency_list[u].push_back(v);
adjacency_list[v].push_back(u);
}
vector<bool> black_nodes(n, false);
// black_nodes[i] is is true if i-th node is black
vector<bool> max_black_nodes(n);
int max_nr_black_nodes = 0;
graph_coloring(n, 0, adjacency_list, 0, black_nodes,
max_nr_black_nodes, max_black_nodes);
cout << max_nr_black_nodes << endl;
bool first = true;
for (int i = 0; i < n; i++)
if (max_black_nodes[i]) {
if (first)
first = false;
else
cout << ' ';
cout << i + 1;
}
cout << endl;
}
return 0;
}
No comments:
Post a Comment