Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/153.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 生成树_C++_Algorithm - Fatal编程技术网

C++ 生成树

C++ 生成树,c++,algorithm,C++,Algorithm,我试图在给定某些图边(可以看作是一个网络)的情况下生成有效的树。下面是从文件中读取图形边的代码 FILE *fin = fopen("somefile.txt", "r"); for (int i = 0; i <=edges; i++) { fscanf(fin, "%d%d%d", &u, &v, &w); graph[u][v]=w; } fclose(fin); FILE*fin=fopen

我试图在给定某些图边(可以看作是一个网络)的情况下生成有效的树。下面是从文件中读取图形边的代码

    FILE *fin = fopen("somefile.txt", "r");

    for (int i = 0; i <=edges; i++) {
    fscanf(fin, "%d%d%d", &u, &v, &w);
            graph[u][v]=w;
    }
    fclose(fin);
FILE*fin=fopen(“somefile.txt”、“r”);
对于(inti=0;i2;1-->3;3-->4.现在如果N是1,那么u=1的可能树是1-->2和1-->3.如果N是2,那么可能树是1-->2&3或1-->3-->4

实现这一点的最佳方法是什么?我不关心复杂性问题。我会感谢您的帮助!

这可能不是最好的实现,但是 像这样的东西应该有用

map<vertex,list<edge>> vertexToedgeThatIncludeIt
void Coloredge(edgeList)
{
  for each edge in list:
     edge.color=True
}


void init()
{
   for each edge:
   {
    vertexToedgeThatIncludeIt[edge.vertex1].append(edge)
    vertexToedgeThatIncludeIt[edge.vertex2].append(edge)
   }
}

edge* findUnColoredvertex(edgeList,startPoistion,founfAt)
{
    skip to startPoistion
    for each edge In edgeList:
          if edge not colored return edge 
    update founfAt
    return NULL
}

void spanTree(vertexToedgeThatIncludeIt,spanTreeList,lastvertex)
{
   if(spanTreeList.size==NumberOfTotalvertex)
   {
        print spanningTree
        return 
   }
   nextedge=findUnColoredvertex(vertexToedgeThatIncludeIt[lastvertex],0,founfAt)
   while(nextedge!=NULL)
   {           
       spanTreeList.append(nextedge);
       Coloredge(vertexToedgeThatIncludeIt[lastvertex]);
       spanTree(vertexToedgeThatIncludeIt,spanTreeList,nextedge.othervertex)
       spanTreeList.pop();
       UnColoredge(vertexToedgeThatIncludeIt[lastvertex])
       nextedge=findUnColoredvertex(vertexToedgeThatIncludeIt[lastvertex],founfAt,founfAt)
   }

 }
map vertextedethatincludeit
空彩色边(边列表)
{
对于列表中的每条边:
edge.color=True
}
void init()
{
对于每条边:
{
VertextedGethatinCludeId[edge.vertex1]。附加(edge)
VertextedGethatinCludeId[edge.vertex2]。附加(edge)
}
}
边缘*findUnColoredvertex(边缘列表、起始权重、founfAt)
{
跳到开始中毒
对于edgeList中的每条边:
如果边未着色,则返回边
更新founfAt
小风一吹
}
void spanTree(VertextedGethatincludeit、spanTreeList、lastvertex)
{
if(spanTreeList.size==NumberOfTotalvertex)
{
打印spanningTree
返回
}
nextedge=findUnColoredvertex(VertextedGethatinCludeId[lastvertex],0,founfAt)
while(nextedge!=NULL)
{           
spanTreeList.append(下一页);
Coloredge(VertextedGethatinCludeit[最后一个顶点]);
spanTree(VertextedGethatinCludeit、spanTreeList、nextedge.othervertex)
spanTreeList.pop();
取消着色(顶点扩展到包含[lastvertex])
nextedge=findUnColoredvertex(VertextedGethatincludeit[lastvertex],founfAt,founfAt)
}
}

welll,我曾尝试使用for循环,但我遇到了一种情况,即使用大量for循环来生成一个包含N个子树的树。这会导致很多混乱:(什么样的for循环?在我们帮助您之前,我们需要看看您是如何考虑解决这个问题的。老实说,我到目前为止所做的没有多大意义,可能是无效的。这就是为什么我要求提供任何关于“更干净”或简单方法的提示。问题陈述需要澄清。您想生成一个ll有向树,根植于顶点u?每个树都需要跨越整个图还是应该有N个大小?你对递归感到满意吗?很抱歉问了一个初级问题,但我如何添加边?(即1-->2;3-->4)。对不起,我不是说英语的人,我用vertexi替换了边。我试图修复它,没有使用自动查找和替换,希望我没有弄糟。如果我做对了,这个问题不能用2d数组解决?最好使用合适的/自然的数据结构,不要试图强加一些合成数据结构,STL让你定义这个简单的Y