void Dijkstra(int cost[][MAX], int lowcost[MAX], int n, int beg)
{
int i, j, min;
memset(vis, 0, sizeof(vis));
vis[beg] = 1;
for (i=0; i<n; i++)
{
lowcost[i] = cost[beg][i];
path[i] = beg;
}
lowcost[beg] = 0;
path[beg] = -1; // 树根的标记
int pre = beg;
for (i=1; i<n; i++)
{
min = INF;
for (j=0; j<n; j++)// 下面的加法可能导致溢出,INF不能取太大
if (vis[j]==0 &&lowcost[pre]+cost[pre][j]<lowcost[j])
{
lowcost[j] = lowcost[pre] + cost[pre][j];
path[j] = pre;
}
for (j=0; j<n; j++)
if (vis[j] == 0 && lowcost[j] < min)
{
min = lowcost[j];
pre = j;
}
vis[pre] = 1;
}
}
typedef struct
{
char vertex[VertexNum]; //顶点表
int edges[VertexNum][VertexNum]; //邻接矩阵,可看做边表
int n,e; //图中当前的顶点数和边数
}MGraph;
void Floyd(MGraph g)
{
int A[MAXV][MAXV];
int path[MAXV][MAXV];
int i,j,k,n=g.n;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
A[i][j]=g.edges[i][j];
path[i][j]=-1;
}
for(k=0;k<n;k++)
{
for(i=0;i<n;i++)
for(j=0;j<n;j++)
if(A[i][j]>(A[i][k]+A[k][j]))
{
A[i][j]=A[i][k]+A[k][j];
path[i][j]=k;
}
}
}
Give a wrong dijstrala here, the processing of updating path is wrong:
const int INF = 0x3fffffff;
void dijstrala(const vector<vector<int>>& cost, int beg, vector<int>& lowcost) {
int n = cost.size(), i, j, pre, min, minIndex;
vector<int> vis(n, 0), path(n);
for (i = 0; i < n; ++i)
lowcost[i] = cost[beg][i];
vis[beg] = 1, pre = beg, path[beg] = -1;
for (i = 1; i < n; ++i) {
for (j = 0; j < n; ++j) {
if (vis[j] == 0 && lowcost[pre] + cost[pre][j] < lowcost[j])
lowcost[j] = lowcost[pre] + cost[pre][j];
}
min = INF, minIndex = pre;
for (j = 0; j < n; ++j)
if (vis[j] == 0 && lowcost[j] < min) {
min = lowcost[j];
minIndex = j;
}
path[minIndex] = pre, vis[minIndex] = 1, pre = minIndex;
}
}