spfa
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<iostream>
#include<algorithm>
#include<queue>
#include<vector>
using namespace std;
const int INF=2e9,maxn=1010;
int n,t;
int d[maxn],vis[maxn];
vector<pair<int,int> >E[maxn];
void init()
{
for(int i=0;i<maxn;i++)E[i].clear();
for(int i=0;i<maxn;i++)vis[i]=0;
for(int i=0;i<maxn;i++)d[i]=INF;
}
int main()
{
int i,j,k;
while(scanf("%d%d",&t,&n)!=EOF)
{
init();
for(i=0;i<t;i++){
int u,v,d;
scanf("%d%d%d",&u,&v,&d);
E[u].push_back(make_pair(v,d));
E[v].push_back(make_pair(u,d));
}
queue<int>q;
q.push(1);d[1]=0;vis[1]=1;
while(!q.empty())
{
int now=q.front();
q.pop();vis[now]=0;
//if(d[now]>d[n])continue; 只需要一个点时
for(i=0;i<E[now].size();i++){
int v=E[now][i].first;
if(d[v]>d[now]+E[now][i].second){
d[v]=d[now]+E[now][i].second;
if(vis[v]==1)continue;
q.push(v);
vis[v]=1;
}
}
}
printf("%d\n",d[n]);
}
return 0;
}
dijkstra
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<iostream>
#include<algorithm>
using namespace std;
const int INF=2e9;
int mp[1010][1010];
int t,n;
void dijkstra()
{
int i,j,k,mi,v;
int d[1010];
int vis[1010];
for(i=1;i<=n;i++){
vis[i]=0;
d[i]=mp[1][i];
}
for(i=1;i<=n;i++){
mi=INF;
for(j=1;j<=n;j++){
if(!vis[j] && d[j]<mi){
v=j;
mi=d[j];
}
}
vis[v]=1;
for(j=1;j<=n;j++){
if(!vis[j] && d[j]>mp[v][j]+d[v]){
d[j]=mp[v][j]+d[v];
}
}
}
printf("%d\n",d[n]);
}
int main()
{
int i,j,k;
while(scanf("%d%d",&t,&n)!=EOF)
{
for(i=1;i<=n;i++){
for(j=1;j<=n;j++){
if(i==j)
mp[i][i]=0;
else mp[i][j]=mp[j][i]=INF;
}
}
int u,v,d;
for(i=1;i<=t;i++){
scanf("%d%d%d",&u,&v,&d);
mp[u][v]=min(mp[u][v],d);
mp[v][u]=min(mp[v][u],d);
}
dijkstra();
}
return 0;
}