题目描述:
给一无向图中各个节点绘色,一共只有两种颜色,使其满足相邻节点颜色不同,并输出其中一种颜色的节点个数及序号;如果不满足,则输出-1。
示例:
第一行输入节点个数V和边数E,第二行输入E条边(每条边对应的两个节点),例如:
7 9
1 2 1 4 2 3 3 4 2 5 4 5 2 6 5 7 6 7
例图:
思路:
从节点1出发,首先入队列,进行广度优先搜索,依次判断当前节点的相邻节点颜色是否符合要求,如不满足要求,结束搜索,如满足要求,最后统计输出其中一种颜色的节点数目及序号。
核心代码如下:
#include <iostream>
#include <vector>
#include <deque>
using namespace std;
int a[1001][1001] = { 0 };
int color[1001][2] = { 0 };
int num[1001];
int num1 = 0;
int main() {
//7 9
//1 2 1 4 2 3 3 4 2 5 4 5 2 6 5 7 6 7
int v, e, x, y;
cin >> v >> e; //输入节点数和边数
for (int i = 0; i < e; i++) {
cin >> x >> y; //输入e条边每条边对应的节点序号
a[x][y] = 1;
a[y][x] = 1;
}
deque<int> deq;
deq.push_back(1);
bool flag = false;
while (!deq.empty()) {
int cur = deq.front(); //cur存储当前所取节点的序号
deq.pop_front(); //将该节点出队列
int tmp = color[cur][0]; //tmp为该节点的颜色
color[cur][1] = 2; //将该节点状态置为2(代表已设置颜色)
for (int j = 1; j <= v; j++) { //寻找与cur相连的节点
if (a[cur][j] == 1 && color[j][1] == 0) { //j节点与cur节点之间有边,且颜色未被设置
color[j][0] = 1 - tmp; //颜色取反
color[j][1] = 2; //设置节点状态
deq.push_back(j); //将该节点入队列
}
if (a[cur][j] == 1 && color[j][1] == 2) { //如果节点j颜色已被设置,判断颜色是否与tmp一致
if (color[j][0] != (1 - tmp)) { //不一致
flag = true;
break;
}
}
}
if (flag) {
num1 = -1;
break;
}
}
if (!flag) {
num1 = 0;
for (int k = 1; k <= v; k++) {
if (color[k][0] == 1)
num[num1++] = k;
}
}
cout << "#:" << num1;
for (int d = 0; d < num1; d++) {
cout << " " << num[d];
}
cout << endl;
return 0;
}
运行结果: