如何构建一个采用图形的C ++程序,为其着色并将该图形打印到.dot文件?

问题描述

问题陈述:给出一个无向图E。构建一个C ++程序以使用贪婪算法为其着色。您将从文件“ graph.txt”中读取输入,第一行包含节点总数n和边总数m,每(m + 1)行包含两个表示边的正整数。结果应打印到文件“ coloredgraph.dot”,该文件代表DOT语言的彩色图形。 (节点的索引从1到n)
例如:
输入:

5 5
1 2 
2 3 
3 4
4 1
1 5

输出:

graph E
{
5 [fillcolor=red,style=filled];
4 [fillcolor=red,style=filled];
1 [fillcolor=green,style=filled];
3 [fillcolor=green,style=filled];
2 [fillcolor=red,style=filled];
1 -- 2;
2 -- 3;
3 -- 4;
4 -- 1;
1 -- 5;
}

我构建了一个C ++程序为图形着色,然后将结果存储在数组color []中(其中color [i-1]是节点i的颜色)。例如,从上面的输入中,我得到了结果color [] = {0,1,0,1,1} (我使用数字0-> n-1表示颜色。这些数字可以表示任何颜色在DOT / Graphviz中可用,不同的数字表示不同的颜色,在这种情况下,0表示黑色/白色/等,1表示绿色/蓝色/等,但是1和0必须表示两种不同的颜色。但是我目前仍然坚持如何将找到的结果转换为具有上述要求格式的.dot文件。我只是C ++的初学者,没有DOT或Graphviz的经验。有人可以使用我发现的结果来帮助我根据需要打印输出吗?非常感谢您提供任何建议。
贪婪算法的实现可以在这里找到:https://www.geeksforgeeks.org/graph-coloring-set-2-greedy-algorithm/
P / s:对不起,我的英语不好

解决方法

您可以使用以下方法打印文件:

std::cout << "graph E\n{\n";
for (std::size_t i = 0; i < nodes; ++i) {
    std::cout << (i+1) << "[fillcolor=" << color[i] << ",style=filled];\n";
}
for (std::size_t i = 0; i < edges.size(); ++i) {
    std::cout << edges[i][0] << " -- " << edges[i][1] << ";\n";
}
std::cout << "}\n";

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...