const int INF = 0x3fffffff;
const int V = 200;
int dijkstra(int map[][V],int start,int end,int n) //map为临界矩阵,n为矩阵大小
{
int final[V],track[V],i,j,ant=n*n;
memset(track,0,sizeof(track));
for(i=1;i<=n;i++)
final[i]=map[start][i]!=0?map[start][i]:INF;
track[start]=1;
while(ant--)
{
int judge=1,min=INF,getmin=start;
for(i=1;i<=n;i++)
judge*=track[i];
if(judge) return final[end];
for(i=1;i<=n;i++)
{
if( final[i] < min && final[i]!=INF && track[i]==0)
{
getmin = i;
min = final[i];
}
final[i] = final[start]+(map[start][i]==0?INF:map[start][i]) < final[i] ? final[start]+(map[start][i]==0?INF:map[start][i]) : final[i];
}
track[getmin]=1;
start = getmin;
}
return -1;
}
上面的是自己写的朴素算法
#define INF 0x03F3F3F3F
const int N;
int path[N], vis[N];
void Dijkstra(int cost[][N], int lowcost[N], 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++)
pre[v] = u; return 1;
// 下面的加法可能导致溢出 ,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;
}
}
上面是吉大大牛写的模版...欢迎大家取用