我正在尝试解决UVA10004,大多数结果都是正确的
但不是全部。
这就是我想要做的:
首先,制作3维向量
[节点] [相邻] [颜色]
例如,nodes:0、1、2边:01 02 12
就像
0 1 2
1 0 2
2 0 1
它的颜色将在每个节点下,使其成为3维向量
默认颜色为0
然后将第一个节点[0] [0]绘制为颜色1 => [0] [0] [1] = 1
然后遍历所有节点
如果节点的颜色为0,则检查节点之前是否已被着色
如果不是,则检查节点的第一列是否为1,然后使其为2
如果是2,则设为1
之后
检查每一行
颜色应为1 2 2 2 ....或2 1 1 1 1 ..... =>双色
如果不是,那么它将不是双色的
所以,我不确定这是否有意义.....
这是测试用例
https://www.udebug.com/UVa/10004
当我尝试测试输入时,它将获得正确的输出 但是在我将代码提交给https://uva.onlinejudge.org/之后 只是说错了答案
#include <iostream>
#include <vector>
#include <string>
#include <fstream>
using namespace std;
void main()
{
int numOfNodes;
int numOfEdges;
vector <int> color;
vector<vector<int>> adjacent;
vector <vector <vector<int>>> nodes;
while(cin >> numOfNodes && numOfNodes)
{
for(int i = 0; i < numOfNodes; i++)
{
color.push_back(i);
color.push_back(0);
adjacent.push_back(color);
nodes.push_back(adjacent);
color.clear();
adjacent.clear();
}
cin >> numOfEdges;
for(int i = 0; i < numOfEdges; i++) //build table
{
int edgeBegin, edgeEnd;
cin >> edgeBegin >> edgeEnd;
color.push_back(edgeEnd);
color.push_back(0);
adjacent.push_back(color);
nodes[edgeBegin].push_back(color);
color.clear();
adjacent.clear();
color.push_back(edgeBegin);
color.push_back(0);
adjacent.push_back(color);
nodes[edgeEnd].push_back(color);
color.clear();
adjacent.clear();
}
for(int i = 0; i < nodes.size(); i++) //paint table
{
for(int j = 0; j < nodes[i].size(); j++)
{
for(int m = 0; m < nodes.size(); m++)
{
for(int n = 0; n < nodes[m].size(); n++)
{
if(nodes[m][n][0] == nodes[i][j][0]) //same number
{
//cout<<"check"<<endl;
if(nodes[m][n][1] == 1)
{
nodes[i][j][1] = 1;
}
else if(nodes[m][n][1] == 2)
{
nodes[i][j][1] = 2;
}
}
}
}
if(j == 0 && i == 0)
{
nodes[i][j][1] = 1;
continue;
}
else
{
for(int m = 0; m < nodes.size(); m++)
{
if(j >= 1)
{
if(nodes[i][0][1] == 1)
{
if(nodes[i][j][1] == 0)
{
nodes[i][j][1] = 2;
}
else
{
break;
}
}
else if(nodes[i][0][1] == 2)
{
if(nodes[i][j][1] == 0)
{
nodes[i][j][1] = 1;
}
else
{
break;
}
}
}
}
}
}
}
bool bicolorable = true;
for(int i = 0; i < nodes.size(); i++)
{
int firstColor = nodes[i][0][1];
for(int j = 1; j < nodes[i].size(); j++)
{
if(firstColor == nodes[i][j][1])
{
bicolorable = false;
}
}
}
if(bicolorable == true)
{
cout << "BICOLORABLE." << endl;
}
else if(bicolorable == false)
{
cout << "NOT BICOLORABLE." << endl;
}
color.clear();
adjacent.clear();
nodes.clear();
}
}