- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
下面的代码对邻接矩阵的所有元素使用深度优先搜索来计算邻接矩阵中表示的图的数量。
出于某种原因,此代码仅适用于某些测试用例,但不适用于其他测试用例,我想修复此问题。
#include <stdio.h>
#include <stdlib.h>
//depth-first search
void dfs(int start, int n, int * visited, int ** family){
int current;
visited[start] = 1;
for(current=0;current<n;++current)
if(visited[current] == 0 && family[start][current] == 1) dfs(current, n, visited, family);
}
//set all visited[i] array integers to zero
void zero(int n, int * visited){
int i;
for(i=0;i<n;++i){
visited[i] = 0;
}
}
int main(){
int ** family;
int * visited;
int ** all_visited;
int n, k;
int i, j, x, y;
int counter = 0;
int familycount = 0;
// n == number of elements
// k == number of lines to be read
scanf("%i %i", &n, &k);
//memory allocation
family = (int**) malloc(sizeof(int*) * n);
for(i=0;i<n;++i){
family[i] = (int*) malloc(sizeof(int) * n);
}
all_visited = (int**) malloc(sizeof(int*) * n);
for(i=0;i<n;++i){
all_visited[i] = (int*) malloc(sizeof(int) * n);
}
visited = (int*) malloc(sizeof(int) * n);
zero(n, visited);
//receive input pairs and build adjacency matrix for the graph
for(i=0;i<k;++i){
scanf("%i %i", &x, &y);
--x;
--y;
family[x][y] = 1;
}
//Perform depth-first search for each element in adjacency matrix.
//If dfs() returns a visited[] array that has never been seen before,
// add +1 to familycount.
for(i=0;i<n;++i){
dfs(i,n,visited,family);
for(j=0;j<n;++j){
all_visited[i][j] = visited[j];
}
for(x=0;x<i;++x){
for(y=0;y<n;++y){
if(all_visited[x][y] == 1 && visited[y] == 1) break;
}
if(y == n) ++counter;
}
if(counter == i ) ++familycount;
zero(n, visited);
counter = 0;
}
printf("%i\n",familycount);
return 0;
}
例如,如果我们采用以下测试用例:
9 8
1 2
2 3
3 6
4 3
6 5
7 8
1 4
6 2
第一行 ("9 8") 表示我们有九个可能的元素(从 1 到 9 的整数),下面是八行输入。
可能 表示我可能会或可能不会输入 9 个顶点,但绝不会超过 9 个。如果我不输入一个顶点,它将被忽略。
以下所有行的意思是“X 与 Y 相关”、“X 与 Y 属于同一个家族”,或者更正式地说,“X 和 Y 属于同一个图”。
如下所示,这个测试用例有两个族或两个图,所以程序输出应该是“2”。
最佳答案
此代码比您要解决的问题要昂贵得多。
这个问题在图论中被称为图连通性,您可以通过对每个节点进行简单的 DFS 来解决它;然后我们将使用 visited
数组作为当前DFS探索的存储。
对于任何顶点 v:
visited[v] = 0
<--> v
还没有探索过
visited[v] < 0
<--> v
正在进行探索,但尚未完成
visited[v] > 0
<--> v
探索完毕
从 v 开始,我们将使用相同的持续计数器值标记它的每个可到达顶点,一旦 DFS 返回,我们将简单地交换 visited[v]
的符号。值,意味着它的探索现在已经结束。
要得到不连通图的个数,只需要统计visited
中有多少个不同的值即可数组。
代码如下:
#include <stdio.h>
#include <stdlib.h>
void dfs(int start, int n, int *visited, int **family, int counter) {
if (visited[start] > 0)
return;
else if (visited[start] == 0)
visited[start] = -counter;
for (int i = 0; i < n; i++) {
if (family[start][i] == 1 && visited[i]==0) {
dfs(i, n, visited, family, counter);
}
}
visited[start] = -visited[start];
return;
}
//set all visited[i] array integers to zero
void zero(int n, int * visited) {
int i;
for (i = 0; i<n; ++i) {
visited[i] = 0;
}
}
int main() {
int ** family;
int * visited;
int n, k;
int i, x, y;
int counter = 1;
int familycount = 0;
int last = -1;
// n == number of elements
// k == number of lines to be read
printf("Insert vertex# and edge#\n");
scanf("%i %i", &n, &k);
//memory allocation
family = (int**)malloc(sizeof(int*) * n);
for (i = 0; i<n; ++i) {
family[i] = (int*)malloc(sizeof(int) * n);
}
visited = (int*)malloc(sizeof(int) * n);
zero(n, visited);
//receive input pairs and build adjacency matrix for the graph
printf("Now insert all the edges, once at time\nFor edge (a,b), insert a b and press Enter\n");
for (i = 0; i<k; ++i) {
scanf("%i %i", &x, &y);
--x;
--y;
family[x][y] = 1;
}
zero(n, visited);
//Perform depth-first search for each element in adjacency matrix.
//If dfs() returns a visited[] array that has never been seen before,
// add +1 to familycount.
for (i = 0; i<n; ++i) {
dfs(i,n,visited,family,counter);
counter++;
}
for (i = 0; i < n; i++) {
if (visited[i] != last) {
familycount++;
last = visited[i];
}
}
printf("Graph #: %i\n", familycount);
return 0;
}
而不是给出 9 8
作为第一个输入,您需要输入 8 8
,分别表示8个顶点和8条边。
关于使用深度优先搜索计算邻接矩阵表示的不同图数的 C 程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46016302/
我在 ma 应用程序中使用 Jqgrid 树 View 模型,我可以看到它显示错误,因为不支持对象或属性我已经包含了 grid.Treeview.js 和其他 Jqgrid 脚本文件。我不知道可能是什
我正在尝试使用图中所示的符号在 matlab 上实现 Freeman Chain Code [4 adjacency]: 我的代码为我测试过的多个小矩阵提供了正确的链码。但是,当我在我的实际图像文件上
我有一张表,其中包含世界上所有地理位置及其关系的位置。 这是一个显示层次结构的示例。你会看到数据实际上存储为所有三个 枚举路径 邻接表 嵌套集 数据显然也不会改变。下面是英格兰布莱顿位置的直系祖先示例
我正在尝试从邻接树模型(id、parent_id)中的 MySQL 数据库中计算/创建或生成 PHP 目录。到目前为止,这是我在回显输出时所取得的成就。 1. Category 1 1 Subc
我知道 std::vector在内部连续存储它的数据(除非它是 std::vector )都在旧的 C++03 中标准和新的C++11 . 处理此问题并引用标准的好 stackoverflow 问题:
Development language and DB: PHP/MySQL 我有一张 geo_places 表,其中包含大约 800 万个地理位置。 这些地方都是分层次的,我用 parent_id
过去几个小时我一直在尝试在网上找到这个问题的解决方案。我找到了很多关于如何从嵌套集合转换为邻接的例子......但很少有相反的例子。我发现的示例要么不起作用,要么使用 MySQL 过程。不幸的是,我不
我是一名优秀的程序员,十分优秀!