Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xcode/7.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#误差中的Dijkstra算法_C#_Algorithm - Fatal编程技术网

C#误差中的Dijkstra算法

C#误差中的Dijkstra算法,c#,algorithm,C#,Algorithm,我是C#编程新手,我试图在C#中实现Dijkstra算法,以获得两个节点之间的最短距离,但我得到以下错误- 错误CS1525:意外符号void',应为class'、delegate'、enum'、interface'、partial'或“struct” 程序cs(54,16):错误CS1525:意外符号int',应为class',delegate',enum',interface',partial',或'struct' prog.cs(54,21):错误CS1514:意外符号[',应为'或`{'

我是C#编程新手,我试图在C#中实现Dijkstra算法,以获得两个节点之间的最短距离,但我得到以下错误-

错误CS1525:意外符号
void',应为
class'、
delegate'、
enum'、
interface'、
partial'或“struct”

程序cs(54,16):错误CS1525:意外符号
int',应为
class',
delegate',
enum',
interface',
partial',或'struct'

prog.cs(54,21):错误CS1514:意外符号
[',应为
'或`{'

prog.cs(54,21):警告CS0658:`'是无效的属性目标。将忽略此属性节中的所有属性

这是我的代码:

using System;
using System.Collections.Generic;

namespace Dijkstras
{
    class Graph
    {
        int V = 9;
        int minDistance(int[] dist, bool[] sptSet)
        {
 
            int min = 100; int min_index=0;

            for (int v = 0; v < V; v++)
                if (sptSet[v] == false && dist[v] <= min)
                   { min = dist[v]; min_index = v;}

            return min_index;
        }

        int printSolution(int[] dist, int n)
         {
            Console.WriteLine("Vertex   Distance from Source");
            for (int i = 0; i < V; i++)
            {
                Console.Write(i); Console.Write("      ");
                Console.WriteLine(dist[i]);
            }return 0;
         }
        void dijkstra(int [,] graph , int src)
          {    //graph=new int[V,V];
                int [] dist=new int[V];    
                bool [] sptSet=new bool[V];
                for (int i = 0; i < V; i++)
                 {  dist[i] = 100;
                    sptSet[i] = false;
                 }
                dist[src] = 0;
                for (int count = 0; count < V-1; count++)
                     {
                        int u = minDistance(dist, sptSet);
                        sptSet[u] = true;
                        for (int v = 0; v < V; v++)
                         {  if (sptSet[v]==false && dist[u] != 100 && dist[u]+graph[u,v] < dist[v])
                                dist[v] = dist[u] + graph[u,v];
                         }
                     }
                printSolution(dist, V);
          }
    }
       
     public static void Main()
      {
                int [,] graph =new int[,] {{0, 4, 0, 0, 0, 0, 0, 8, 0},
                      {4, 0, 8, 0, 0, 0, 0, 11, 0},
                      {0, 8, 0, 7, 0, 4, 0, 0, 2},
                      {0, 0, 7, 0, 9, 14, 0, 0, 0},
                      {0, 0, 0, 9, 0, 10, 0, 0, 0},
                      {0, 0, 4, 0, 10, 0, 2, 0, 0},
                      {0, 0, 0, 14, 0, 2, 0, 1, 6},
                      {8, 11, 0, 0, 0, 0, 1, 0, 7},
                      {0, 0, 2, 0, 0, 0, 6, 7, 0}
                     };
                dijkstra(graph, 0);
     }
        
 }
使用系统;
使用System.Collections.Generic;
命名空间Dijkstras
{
类图
{
int V=9;
内部距离(内部[]距离,布尔[]标准点)
{
最小整数=100;最小整数指数=0;
对于(int v=0;v如果(sptSet[v]==false&&dist[v]首先在此处发现问题:

public static void Main()

它是在任何类之外声明的方法,只是在名称空间中-这不能在C#中完成。请将它包装到某个类中。

首先在此处发现问题:

public static void Main()

它是在任何类之外声明的方法,只是在名称空间中-这不能在C#中完成。将它包装到某个类中。

这里有几个问题

  • Main函数不在类内。在C#中,所有方法都必须在类内。将Main移到Graph类内
  • 您的函数需要是静态的,以便可以从主方法引用它们
  • 您的变量需要是静态的,以便可以从现在的静态函数引用它们
  • 除了2和3之外,您还可以使用面向对象编程,从Graph类中生成一个对象,而不是执行所有静态函数

    Graph graphObject = new Graph();
    graphObject.dijkstra(graph, 0);
    
    然后你可以让一切都不是静止的


    执行所有这三个步骤,它就会编译。不过我没有检查正确性。

    这里有几个问题

  • Main函数不在类内。在C#中,所有方法都必须在类内。将Main移到Graph类内
  • 您的函数需要是静态的,以便可以从主方法引用它们
  • 您的变量需要是静态的,以便可以从现在的静态函数引用它们
  • 除了2和3之外,您还可以使用面向对象编程,从Graph类中生成一个对象,而不是执行所有静态函数

    Graph graphObject = new Graph();
    graphObject.dijkstra(graph, 0);
    
    然后你可以让一切都不是静止的


    执行所有这三个步骤,它就会编译。不过我没有检查正确性。

    您已将主方法放在graph类之外。将主方法移到graph类中,并按如下方式调用dijkstra:

    new Graph().dijkstra(graph, 0);
    

    您已将main方法放在graph类之外。请将main方法移到graph类内,然后按如下方式调用dijkstra:

    new Graph().dijkstra(graph, 0);
    

    算法标签与问题无关,这些都是编译时错误和警告。可怕的编码BTW,考虑读取C中的一些命名和编码约定。参见乔恩SkestStor的回答。算法标签与问题无关。这些都是编译时错误和警告。可怕的代码BTW,考虑阅读一些命名。和C#中的编码约定。请参阅Jon Skeet的开始答案。