33,010
社区成员
发帖
与我相关
我的任务
分享
#include <stdio.h>
#include <malloc.h>
typedef struct _NODE
{
struct _NODE* Next[4];
struct _NODE* Prev;
int x;
int y;
int Distance;
int Corner;
int Flag; // 0-未处理, 1-待延伸, 2-新增加, 3-已处理
} NODE;
void Discover(NODE* Node, int Len)
{
bool Exchange = true;
while (Exchange)
{
for (int i = 0; i < Len; ++i)
{
if (Node[i].Flag == 1)
{
for (int f = 0; f < 4; ++f)
{
int Distance = Node[i].Distance;
int Corner = Node[i].Corner + 1;
NODE* p = &Node[i];
while (p->Next[f] != NULL)
{
p = p->Next[f];
++Distance;
if (p->Flag == 0 || p->Distance > Distance || (p->Distance == Distance && p->Corner > Corner))
{
p->Prev = &Node[i];
p->Corner = Corner;
p->Distance = Distance;
p->Flag = 2;
Exchange = true;
}
}
}
Node[i].Flag = 3;
}
}
Exchange = false;
for (int i = 0; i < Len; ++i)
{
if (Node[i].Flag == 2)
{
Node[i].Flag = 1;
Exchange = true;
}
}
}
}
int main()
{
int Width = 13; //图中横向的点数
int Height = 5; // 图中纵向的点数
// Cut 是从图中删除的线条:坐标x, 坐标y, 方向(0-Right,1-Up,2-Left,3-Down)
// 原题中是只有纵线不可通过,这里扩展到横、纵都允许。
int Cut[8][3] = {{5,0,3},{6,0,3},{10,0,3},{11,0,3},{9,2,3},{10,2,3},{5,3,3},{6,3,3}};
// Start 是起点坐标(x, y)
int Start[2] = {11, 0};
// Final 是终点坐标(x, y)
int Final[2] = {5, 4};
// 根据条件,初始化环境
NODE* Node = (NODE*)malloc(sizeof(NODE) * Height * Width);
for (int y = 0; y < Height; ++y)
{
int base = y * Width;
for (int x = 0; x < Width; ++x)
{
Node[base + x].Corner = 0;
Node[base + x].Distance = 0x10000;
Node[base + x].Flag = 0;
Node[base + x].Prev = NULL;
Node[base + x].x = x + 1;
Node[base + x].y = y + 1;
Node[base + x].Next[0] = x < Width - 1 ? &Node[base + x + 1] : NULL;
Node[base + x].Next[1] = y > 0 ? &Node[base + x - Width] : NULL;
Node[base + x].Next[2] = x > 0 ? &Node[base + x - 1] : NULL;
Node[base + x].Next[3] = y < Height - 1 ? &Node[base + x + Width] : NULL;
}
}
for (int i = 0; i < 8; ++i)
{
Node[Cut[i][1] * Width + Cut[i][0]].Next[Cut[i][2]]->Next[3 - Cut[i][2]] = NULL;
Node[Cut[i][1] * Width + Cut[i][0]].Next[Cut[i][2]] = NULL;
}
// 定义起点,并进行搜索
NODE* pStart = &Node[Start[1] * Width + Start[0]];
pStart->Distance = 0;
pStart->Flag = 1;
Discover(Node, Width * Height);
// 输出
NODE* Stack[100];
int Index = 0;
NODE* p = &Node[Final[1] * Width + Final[0]];
while (p->Distance > 0)
{
Stack[Index++] = p;
p = p->Prev;
}
printf_s(" (%2d, %2d, %2d, %2d)\n", p->x, p->y, p->Distance, p->Corner);
while (Index > 0)
{
p = Stack[--Index];
printf_s("--> (%2d, %2d, %2d, %2d)\n", p->x, p->y, p->Distance, p->Corner);
}
free(Node);
printf_s("按回车结束 ...");
getchar();
return 0;
}
/**
Dijkstra algorithm Single Source Shortest path
next : cluster according to the begin point of the edge.
head[]: the first edge of begin with _;
Time complexity O(ElogV)
*/
#include <iostream>
#include <vector>
#include <algorithm>
#include <queue>
#include <string.h>
#include <stdio.h>
using namespace std;
#define V 100
#define E 1000
#define INF 329999
// v :the end point of an edge. w : the weight of the weight next:cluster according to the begin point of the edge
struct node
{
int v, w,next;
node(int vv=0, int ww=0):v(vv),w(ww){}
bool operator < (const node& r) const{return w> r.w;}
}pnt[E];
int e=0,N,M;
int head[V];
int dis[V];
bool vis[V];
int src, sink;
void Dijkstra()
{
priority_queue<node> Q;
vis[src] = 1; dis[src] = 0;
Q.push(node(src, 0));
for (int u = src, i=1; i< N; i++)
{
for (int j = head[u]; j != -1; j = pnt[j].next) // j is edge number.
{
int v = pnt[j].v;
if (vis[v] == 0 && dis[v] > dis[u] + pnt[j].w )// pre is the current vertex
{
dis[v] = dis[u] + pnt[j].w;
Q.push(node(v, dis[v]));
}
}
while (!Q.empty() && vis[Q.top().v]) Q.pop();
if (Q.empty()) break;
vis[u = Q.top().v] = 1; Q.pop();
}
}
inline void addedge(int u, int v, int w){
pnt[e].v = v; pnt[e].w = w; pnt[e].next= head[u]; head[u]=e++;
}
void Dijkstra_init()
{
e = 0;
memset(head, -1, sizeof(head));
memset(vis, 0, sizeof(vis));
for (int i = 0; i < N; i++) dis[i] = INF;
addedge(0,2,1);
addedge(2,0,1);
addedge(0,1,4);
addedge(1,0,4);
addedge(1,3,1);
addedge(3,1,1);
addedge(2,3,4);
addedge(3,2,4);
addedge(2,4,2);
addedge(4,2,2);
addedge(3,5,2);
addedge(6,3,2);
addedge(4,5,3);
addedge(5,4,3);
}
int main()
{
N= 6, M=7;
src =0;
Dijkstra_init();
Dijkstra();
return 0;
}
这个是之前写的优先队列优化的Dijkstra,你照着改一下吧。在node中加相关属性,松弛条件改一下就OK。