C#中的欧拉之旅

时间:2017-01-16 16:33:14

标签: c# algorithm

我想知道下面的C#代码通过Hierholzer算法产生Euler Tour顶点索引有什么问题,假设所有顶点都有均匀度,所以巡视可以从任何地方开始:

(其中pt_id是表示由边组成的起点和终点索引的整数列表的列表)

PS。 GraphMatrix最初由以下项目组成,如果由于缺乏关于pt_id的信息而提供任何帮助:

n y y n y y n n n n n

y n n n y n n n n n n

y n n y y y n n n n n

n n y n n y n y y n n

y y y n n y n n n n n

y n y y y n n n n n n

n n n n n n n y y y y

n n n y n n y n y n y

n n n y n n y y n n y

n n n n n n y n n n y

n n n n n n y y y y n

代码:

Stack tempPath = new Stack();
ArrayList finalPath = new ArrayList();

int total = 11;//total number of nodes

string[] nodeList = new string [total];//to store the nodes
string[,] GraphMatrix = new string [total, total];//to store the edge representation of graph

//node/vertice to nodeList array
for(int i = 0; i < total; ++i) {
  nodeList[i] = i.ToString();
}


//edge details in the graph(connectivity boolean matrix)
//matrix first filled with "n"
for(int i = 0; i < total; ++i) {
  for(int j = 0; j < total; ++j) {
    GraphMatrix[i, j] = "n";
  }
}
//if connection exists, matrix item is changed to "y"
for(int i = 0; i < pt_id.Count; ++i) {
  GraphMatrix[pt_id[i][0], pt_id[i][1]] = "y";
  GraphMatrix[pt_id[i][1], pt_id[i][0]] = "y";
}


//start tour

int s = 0;
int ind = 0;
tempPath.Clear();

tempPath.Push(nodeList[0]);

while(tempPath.Count != 0 && s < 100) {

  int index = 0;
  while (tempPath.Peek().ToString() != nodeList[index] && s < 100) {
    index++;
    s++;
  }

  ind = index;
  for(int i = 0; i < total; ++i) {
    if(GraphMatrix[ind, i] != "y") {
      finalPath.Add(tempPath.Pop());
    }
    else{
      GraphMatrix[ind, i] = "n";
      GraphMatrix[i, ind] = "n";
      tempPath.Push(nodeList[i]);
    }
  }
  s++;
}

我收到错误,说堆栈是空的。

非常感谢,

1 个答案:

答案 0 :(得分:0)

看起来你想要在行

中浏览堆栈的所有元素
  while (tempPath.Peek().ToString() != nodeList[index] && s < 100) {

但是Peek()只返回堆栈顶部的元素而不删除它。因此,在该行中,您将比较堆栈顶部的元素与nodelist中的元素。

要迭代堆栈中的所有元素,你可以

int index = 0;
foreach (var element in tempPath)
{
    if (element.ToString() == nodelist[index] && s >= 100)
    {
         break;
    }
    else 
    {
         index ++;
         s++;
    }
}

您的代码存在第二个问题。 在致电tempPath.Pop()之前,您需要检查是否有任何项目,并执行您的算法所需的其他内容,而不是调用Pop()