我在做一些编程挑战时遇到了这个问题:
圆桌位于一个巨大的大厅中,由N把椅子围成一圈。每个骑士都想坐在他的朋友旁边,否则他就拒绝坐下。
第一行给出了一个整数n,其中n是圆桌骑士的数量(3<=n<=100)。骑士从1到n编号。
接下来的n行中,每行包含一个由0或1组成的长度为n的序列,以空格分隔。第i个序列表示第i个骑士的友谊关系。第j个值确定第i个骑士是否是第j个骑士的朋友。如果值为1,则它们是朋友;如果值为0,则它们不是朋友。
由于友谊是互相的,如果i是j的朋友,那么j也是i的朋友。
输出
如果骑士们可以围坐在圆桌周围,则显示“YES”,否则显示“NO”。
据我所理解,我们被给予的是一个邻接矩阵,实际上是一个无向图,其中节点是骑士,边表示友谊关系。现在我的想法是在图中搜索一个长度为N的循环,或者说是一个哈密顿循环。如果是这种情况,输出YES,否则输出NO。
我的代码在提供的基本示例中是有效的,但在某些测试中,当N变得足够大时,它会出现错误。请注意,这是一个错误的答案,而不是时间限制错误。
这是我的代码:
我是否遗漏了一些非常明显的东西,导致我的代码在更大的输入下失败?或者我是否遗漏了需要处理的特殊情况?
我会非常感谢任何提示。提前谢谢!
示例输入:
5 0 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 1 1 0 1 1 1 1 1 0
示例输出:
是的
圆桌位于一个巨大的大厅中,由N把椅子围成一圈。每个骑士都想坐在他的朋友旁边,否则他就拒绝坐下。
第一行给出了一个整数n,其中n是圆桌骑士的数量(3<=n<=100)。骑士从1到n编号。
接下来的n行中,每行包含一个由0或1组成的长度为n的序列,以空格分隔。第i个序列表示第i个骑士的友谊关系。第j个值确定第i个骑士是否是第j个骑士的朋友。如果值为1,则它们是朋友;如果值为0,则它们不是朋友。
由于友谊是互相的,如果i是j的朋友,那么j也是i的朋友。
输出
如果骑士们可以围坐在圆桌周围,则显示“YES”,否则显示“NO”。
据我所理解,我们被给予的是一个邻接矩阵,实际上是一个无向图,其中节点是骑士,边表示友谊关系。现在我的想法是在图中搜索一个长度为N的循环,或者说是一个哈密顿循环。如果是这种情况,输出YES,否则输出NO。
我的代码在提供的基本示例中是有效的,但在某些测试中,当N变得足够大时,它会出现错误。请注意,这是一个错误的答案,而不是时间限制错误。
这是我的代码:
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
void dfs_search(vector<vector<int> > &matrix, vector<bool> &visited, int node, int parent, int n, int path, bool &found){
if(found)
return;
else if(visited[node] && node == parent && path == n){
found = 1;
return;
}
else if(visited[node])
return;
else{
visited[node] = 1;
path++;
//cout<<node<<" "<<path<<endl;
for(int i=0; i < n; i++){
if(matrix[node][i] == 1){
dfs_search(matrix, visited, i, parent, n, path, found);
}
}
visited[node] = 0;
path--;
}
}
int main(){
int n;
cin >> n;
bool found = 0;
vector<vector<int> > matrix(n, vector<int>(n));
vector<bool> visited(n, 0);
for(int i=0; i<n; i++){
for(int j=0; j<n; j++)
cin>>matrix[i][j];
}
for(int i=0; i<n; i++){
dfs_search(matrix, visited, i, i, n, 0, found);
if(found){
break;
}
}
if(found)
cout<<"YES";
else
cout<<"NO";
return 0;
}
我是否遗漏了一些非常明显的东西,导致我的代码在更大的输入下失败?或者我是否遗漏了需要处理的特殊情况?
我会非常感谢任何提示。提前谢谢!
示例输入:
5 0 1 1 0 1 1 0 0 1 1 1 0 0 1 1 0 1 1 0 1 1 1 1 1 0
示例输出:
是的
i = 0
)。 - undefinedmain
里多次调用dfs_search
?如果存在哈密顿回路,你可以从任意顶点开始找到它;从第0个顶点开始和其他任何顶点一样好。 - undefined