Dijkstra:
const int N=100+5;
int n,m,t;
int i,j,k;
int d[N];
int f[N][N];
bool vis[N];
void init()
{
for(int i=1;i<=n;i++){
for(int j=i;j<=n;j++){
if(j==i) f[i][j]=f[j][i]=0;
else f[i][j]=f[j][i]=inf;
}
}
}
void Dijkstra(int s)
{
ms(vis,0);
for(i=1;i<=n;i++) d[i]=f[s][i];
for(int i=1;i<=n;i++){
int tag=-1;
int minn=inf;
for(int j=1;j<=n;j++){
if(!vis[j] && d[j]<minn){
minn=d[j];
tag=j;
}
}
if(tag==-1) break;
vis[tag]=1;
for(int j=1;j<=n;j++){
if(!vis[j] && d[j]>d[tag]+f[tag][j])
d[j]=d[tag]+f[tag][j];
}
}
}
int main()
{
//IOS;
while(~sdd(n,m)){
if(n==0 && m==0) break;
init();
int u,v,w;
for(i=1;i<=m;i++){
sddd(u,v,w);
f[u][v]=f[v][u]=w;
}
Dijkstra(1);
pd(d[n]);
}
//PAUSE;
return 0;
}
Spfa:
const int N=2e5+5;
int n,m,t;
int i,j,k;
int head[N],all=0;//id,edge_num
int d[N]; //点 i 到起点的距离
bool vis[N];
struct Edge
{
int to,next;
int w;
}G[N];
void add(int u,int v,int w)
{
G[all].w=w;
G[all].to=v;
G[all].next=head[u];
head[u]=all++;
}
void SPFA(int s)
{
for(int i=0;i<N;i++) vis[i]=0,d[i]=inf;
d[s]=0; vis[s]=1;
queue<int> q;
q.push(s);
while(!q.empty()){
int u=q.front();
q.pop();
vis[u]=0;
for(int i=head[u];i!=-1;i=G[i].next){
int v=G[i].to;
int w=G[i].w;
if(d[v]>d[u]+w){
d[v]=d[u]+w;
if(!vis[v]){
vis[v]=1;
q.push(v);
}
}
}
}
}
int main()
{
//IOS;
while(~sdd(n,m)){
if(n==0 && m==0) break;
int u,v,w;
ms(head,-1);
all=0;
for(i=1;i<=m;i++){
sddd(u,v,w);
add(u,v,w);
add(v,u,w);
}
SPFA(1);
pd(d[n]);
}
//PAUSE;
return 0;
}