无法输入图形 我正在解决C++中的问题,但我无法理解如何输入图形,从而在Dijkstra中应用了该算法。 以下是图表格式- 4.3 x1s3 4×4 x1D2

无法输入图形 我正在解决C++中的问题,但我无法理解如何输入图形,从而在Dijkstra中应用了该算法。 以下是图表格式- 4.3 x1s3 4×4 x1D2,c++,algorithm,graph,dijkstra,C++,Algorithm,Graph,Dijkstra,第一行表示网格的列和行,“S”和“D”分别表示源和目标数字-表示通过该块所需的时间,“X”表示禁止进入区域。 如何按照DIjkstra算法的要求在节点和边中转换以下图形。我不知道如何将该贴图转换为图形。无需将矩阵转换为节点和边。 您可以创建包含(行号、列号、时间)的结构,其中时间表示从源到达此坐标所需的时间。现在,用key作为time为这个结构创建一个min堆。现在从min heap中提取元素(最初源将在min heap中,时间为0),并将相邻元素推送到min heap中(仅限于未访问且不包含X

第一行表示网格的列和行,
“S”和“D”分别表示源和目标
数字-表示通过该块所需的时间,“X”表示禁止进入区域。

如何按照DIjkstra算法的要求在节点和边中转换以下图形。我不知道如何将该贴图转换为图形。

无需将矩阵转换为节点和边。
您可以创建包含(行号、列号、时间)的结构,其中时间表示从源到达此坐标所需的时间。现在,用key作为time为这个结构创建一个min堆。现在从min heap中提取元素(最初源将在min heap中,时间为0),并将相邻元素推送到min heap中(仅限于未访问且不包含X的元素)提取元素true的已访问集合。继续这样做,直到提取元素不是目标。

无需转换。想象一下你在某个点上(i,j)。(我假设每个方块允许四个移动)。然后,您可以转到(i+1,j),(i,j+1),(i-1,j),(i,j-1),如果:

1) 该索引在表中 2) 该索引没有用X标记

所以,你给你的Dijkstra算法一个正方形S的位置。每次向数据结构中添加新的一组允许的正方形时。一旦到达D的位置,就可以打印它

此外,这个问题对我来说似乎并不重要,所以您可以使用简单的BFS,也可以使用队列。但是如果你想使用Dijkstra,去不同的广场需要不同的费用。您可以使用优先级队列而不是队列。 例如,可以使用如下设置的数据结构:

 int dist[][]; // this contains the cost to get to some square
//dist is initialized with a large number

struct node{
    int i, j; //location
    node(int ii, int jj){
        i = ii;
        j = jj;
    }

    bool operator < (node &n)const{ //set in c++ will use this to sort
        if(dist[i][j] == dist[n.i][n.j]) return i < n.i || j < n.j; //this is necessary
        return dist[i][j] < dist[n.i][n.j];
    }
};

set <node> q;

int main(){
    //initialized dist with large number
    dist[S.i][S.j] = 0; //we start from source
    q.push(node(S.i, S.j));
    while(true){
        //pick the first element in set
        //this element has the smallest cost
        //update dist using this node if necessary
        //for every node that you update remove from q and add it again
        //this way the location of that node will be updated in q
        //if you see square 'D' you are done and you can print dist[D.i][D.j]
    }

    return 0;
}
int dist[][];//这包括到达某个广场的费用
//dist是用一个大的数字初始化的
结构节点{
int i,j;//位置
节点(int ii,int jj){
i=ii;
j=jj;
}
C++中的BooCalp<(节点和n)const {//SET将使用此排序
if(dist[i][j]==dist[n.i][n.j])返回i
hm也许在这里问这类问题是不对的(但我不知道是什么…)试着改变问题,发布一些你专注于单个问题的代码。。这太大了,太理论化了。请给我们更多关于你的问题的信息。。。例如:我可以走对角线吗?那么让我们说从D到S?还是只有垂直和水平?下一步:您想使用2D数组或notelist adj.矩阵/列表还是类似于链表(连接的节点)…顺便问一下:您只想知道如何转换吗?或者你在编写dijkstra的程序时也有问题吗?你在这一点上被卡住了吗?阅读地图,将地图读入图形,或者写一个可以读入地图的图形?你需要减少可能性,否则问题可能会被锁定为不清楚或太广泛。不,任何人都不能走对角线,而且我之前在邻接列表中编码了标准问题。我对Dijkstra没有问题,只有我知道如何用邻接表或邻接矩阵来应用它,你能建议如何在Min HeAPP中推导出相邻元素,所以C++中的PrimRythySype队列是非常简单的语法。(代码:priority_queue q;)如果cmp是functor,您可以在google上搜索ITI,谢谢您能告诉我为什么重载“它是重载的,因为当您将节点放入集合数据结构中时,集合需要能够比较两个节点。但是,如果您有一个集合或集合。。。因为这些基本类型已经可以比较了。操作员确保距离最近的节点始终是集合中的第一个元素。否则,我们无法在O(logn)中找到并删除最近的节点,因为我们可能需要在O(n)中搜索整个集合。