这是POJ2387的代码,纯板子
#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <string>
#include <vector>
#include <cstdio>
#include <queue>
using namespace std;
const int maxn=1e3+10;
const int INF=1e6;
int t,n;
int Mao[maxn][maxn];
int min1,v;
int d[maxn];//储存一个点到各点的距离
bool vis[maxn];
void inition()
{
for(int i=1; i<=n; i++)
{
for(int j=1; j<=n; j++)
{
if(i==j) Mao[i][j]=0;
else Mao[i][j]=Mao[j][i]=INF;//未处理过的初始化为无穷
}
vis[i]=0;
d[i]=Mao[1][i];
}
}
void dijkstra()
{
for(int i=1; i<=n; i++)
{
min1=INF;
for(int j=1; j<=n; j++)
if(!vis[j] && d[j]<min1)
{
v=j;//记录最近的点和距离
min1=d[j];
}
vis[v]=1;//找完了标记访问过
for(int j=1; j<=n; j++)//更新和V相连接的点的值
if(!vis[j] && d[j]>Mao[v][j]+d[v])
d[j]=Mao[v][j]+d[v];
}
printf("%d\n",d[n]);
}
int main()
{
while(scanf("%d%d",&t,&n)!=EOF)
{
inition();
int u,v,l;
for(int i=1; i<=t; i++)
{
scanf("%d%d%d",&u,&v,&l);
if(Mao[u][v]>l) Mao[u][v]=Mao[v][u]=l;//判断重边并且储存
}
dijkstra();
}
return 0;
}
这种写法复杂度为O(n*n),但是好写。白书紫书都有队列优化的算法就不写了。