我对什么是有向图和无向图进行了研究。我的方法是使用DFS算法。我知道当visitedM[iVertices]
为true
或节点被访问两次时,这意味着它不是树。我还使用下面的定理来确定一个图是否是一棵树。
Theorem: Any connected graph with n vertices and n-1 edges is a tree
我的代码是通过从文件中读取顶点数和边数来初始化的,如下所示
6 7
1 2
1 5
1 6
2 5
正如您所看到的,每条边与源顶点和目标顶点列在一条线上。顶点从1开始。边是无向的,一旦以最小顶点id开始,将在文件中列出。例如,对于边2-5和5-2,文件将仅具有2-5。
我的问题是,我不知道是否应该分配节点内存,如何将节点插入到图中,如何从DFS代码中分辨出不是树。我还有void dfs
作为一个int函数,返回访问顶点的计数<代码>整数dft(图形*g、整数iV、整数VisitedM[])。该函数类似于myvoid DFS
,但如果visitedM[iV]
,则返回0,visitedM[iV]=TRUE
,并返回iCount
。我还认为我的数据结构很混乱。
#define MAX_VERTICES 100
typedef struct EdgeNode
{
int y;
int w; //weight
int iVertex //susbcript in vertexM for TO Vertex
struct EdgeNode *pNextEdge;
}EdgeNode;
typedef struct Vertex
{
char szLabel[100 +1 ];
EdgeNode *successorList;
}Vertex;
typedef struct
{
int iNumVertices;
int iNumEdges;
int iDirected;
Vertex vertexM[MAX_VERTICES +1];
int iParent[MAX_VERTICES + 1];
int iVisitedM[MAX_VERTICES + 1];
int degree[MAX_VERTICES + 1];
EdgeNode *edge[MAX_VERTICES +1];
}GraphImp;
typedef GraphImp *Graph;
int main(int argc, char *argv[])
{
FILE *pFile;
Graph graph;
char szInputBuffer[100];
int numEdges, numVertices;
pFile = fopen("a.txt","r");
if( pFile == NULL)
{
printf("FILE DOES NOT EXIST \n");
return;
}
//reads file until EOF
while(fscanf(pFile, "%d%d", &graph.iVertices, &graph.iEdges) != EOF)
{
//printf is to track the input from file
printf("num of vertices: %d \n num of edeges: %d \n",graph.iVertices, graph.iEdges);
}
fclose(pFile);
}
void dft(Graph *g, int iV, int visitedM[])
{
EdgeNode *e;
if(visitedM[iV])
return;
for( e = g->vertexM[iV].sucessorList; e!= NULL; e = e->pNextEdge)
{
dft(g, e->iVertex, visitedM);
}
}
让我给你一个稍微不同的方法来解决这个问题。
给定问题{6,7},{1,2},{1,5},{1,6},{2,5}
中的边集,有5个顶点{1,2,5,6,7}
和5条边。我们立即得出结论,图不可能是树,因为根据定理,一个有5个顶点的图必须有4条边。
要使问题变得更难,请删除其中一条边,留下{{6,7},{1,2},{1,6},{2,5}
。现在我们有了正确的边数,所以根据定理,我们只需要证明图是连通的。这可以通过给图形着色来完成。
要给图形着色,请实现以下三条规则
如果每个顶点最终都有相同的颜色,那么这个图是相连的。
下表显示了处理每个边缘时颜色分配是如何随时间变化的。
| color assignments
vertex | start {6,7} {1,2} {1,6} {2,5}
-------+-------------------------------
1 | 0 0 2 1 1
2 | 0 0 2 1 1
3 | 0 0 0 0 0
4 | 0 0 0 0 0
5 | 0 0 0 0 1
6 | 0 1 1 1 1
7 | 0 1 1 1 1
开始时,所有顶点均未着色,由数字0表示。第一条边{6,7}为顶点6和7指定新颜色。第二条边{1,2}为顶点1和2指定新颜色。第三条边{1,6}连接具有不同颜色的顶点,因此颜色为2的所有顶点都将更改为颜色1。最后一条边{2,5}将有色顶点与未着色顶点连接起来,因此颜色1被指定给顶点5。
处理完所有边后,所有着色顶点都具有相同的颜色,因此图形是连接的。此外,边的数量比顶点的数量少一个。因此,图形是一棵树。
如果二叉树是使用递归的bst,我正在尝试编写一个bool函数来返回true,我需要一些关于haskell语法的指导。 我知道要使二叉树成为 bst,左侧子树必须始终仅包含小于头部的节点。并且右侧子树必须始终仅包含大于头部的节点。我正在这样构建我的函数: 但是此代码会导致错误: 无法将预期类型“Bool”与实际类型“Int”匹配 参考
问题内容: 好的,我的问题不是如何确定数字是否为质数,因为我想我已经知道了,但是更多的是如何使其正确显示。 这是我的代码: 现在我的问题是,如果数字最终等于9,它会说它是质数,而不是。我认为问题在于中断在一个循环后就停止了它,因此它不会递增变量p,因此仅测试除以2(我认为)。但是,如果我删除断点,它将在每次通过时打印出“和不是素数”,直到退出循环为止。不知道该怎么办。 问题答案: 查找数字是否为素
问题内容: 我正在尝试确定给定类型()是否为可选类型,我正在使用此测试 但它始终返回false。 那么有什么办法可以做到这一点? 问题答案: 假设您要执行的操作是这样的: 可悲的是,swift当前(从Swift 2开始)不支持协方差和协变,并且不能直接针对类型进行类型检查: 一种替代方法是使特定协议扩展,并检查该类型:
我在找一个算法(或者其他什么方法)来确定一个给定的加权图在O(ElogV)中是否有唯一的MST(最小生成树)? 我对体重一无所知(如体重(e1)!= weight(e2)),如果该图只有一个唯一的MST,则算法返回True,否则返回False。 我首先使用 Kruskal 的算法,并检查 find-set(u)==find-set(v) 是否因此在 MST 中有一个圆圈,但这种方式并没有涵盖我认为
问题内容: 使用PHP(给定URL),如何确定它是否是图像? URL没有上下文-它只是在纯文本文件的中间,或者可能只是一个字符串。 我不希望开销很大(例如,读取URL的内容),因为页面上的许多URL都可以调用此方法。鉴于此限制,识别所有图像并不是必需的,但是我想作一个很好的猜测。 目前,我只是在看文件扩展名,但是感觉应该有比这更好的方法。 这是我目前拥有的: 编辑: 如果对其他人有用,这里是使用E
问题内容: 我在Java中使用PdfBox从PDF文件提取文本。提供的某些输入文件无效,这些文件上的PDFTextStripper暂停。有没有一种干净的方法来检查提供的文件是否确实是有效的PDF? 问题答案: 您可以找出文件(或字节数组)的mime类型,因此不必盲目地依赖扩展名。我是用光圈的MimeExtractor(http://aperture.sourceforge.net/)来完成的,或者