Spfa
#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
const int N = 310;
int n,g[N][N],dist[N];
bool st[N];
void Spfa(int s)
{
queue<int> q;
memset(dist,0x3f,sizeof dist);
memset(st,false,sizeof st);
for(int i=1;i<=n;i++)
if(i!=s)
{
st[i]=true;
dist[i]=g[s][i];
q.push(i);
}
while(!q.empty())
{
int t=q.front();q.pop();
st[t]=false;
for(int j=1;j<=n;j++)
{
if(dist[j]>dist[t]+g[t][j])
{
dist[j]=dist[t]+g[t][j];
if (!st[j])
{
q.push(j);
st[j]=true;
}
}
}
}
}
int main()
{
while(scanf("%d",&n)!=EOF)
{
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
scanf("%d",&g[i][j]);
Spfa(1);
int a=dist[1],b=dist[n];
Spfa(n);
int c=dist[n];
printf("%d\n",min(b,a+c));
}
return 0;
}
Dijkstra
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
const int N = 310;
int n,g[N][N],dist[N];
bool st[N];
void dijkstra(int s)
{
memset(dist,0x3f,sizeof dist);
memset(st,false,sizeof st);
dist[s]=0;
for(int i=1;i<=n-1;i++)
{
int t=-1;
for(int j=1;j<=n;j++)
if(!st[j]&&(t==-1||dist[t]>dist[j]))
t=j;
st[t]=true;
for(int j=1;j<=n;j++)
dist[j]=min(dist[j],dist[t]+g[t][j]);
if(i==1) dist[s]=0x3f3f3f3f;
}
}
int main()
{
while(scanf("%d",&n)!=EOF)
{
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
scanf("%d",&g[i][j]);
dijkstra(1);
int a=dist[1],b=dist[n];
dijkstra(n);
int c=dist[n];
printf("%d\n",min(b,a+c));
}
return 0;
}