这是一道简单的最短路题
Dijkstra
没学过的可以看下面这个链接
http://blog.51cto.com/ahalei/1387799
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int inf=0x3f3f3f3f;
int map[1010][1010],d[1010],v[1010];
int main()
{
int t,n;
while(~scanf("%d%d",&t,&n))
{
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
if(i==j)
map[i][j]=0;
else
map[i][j]=inf;
}
int a,b,c;
for(int i=0;i<t;i++)
{
scanf("%d%d%d",&a,&b,&c);
if(map[a][b]>c) //第一次用 Dijkstra ,一开始不知道这里还要判断 ,在wr了很多次才知道这立还要判断
map[a][b]=map[b][a]=c;
}
for(int i=1;i<=n;i++)
{
d[i]=map[n][i];
v[i]=0;
}
v[n]=1;
int u,m;
for(int i=n;i>1;i--)
{
m=inf;
for(int j=n;j>=1;j--)
{
if(!v[j] && d[j]<m)
{
m=d[j];
u=j;
}
}
v[u]=1;
for(int j=n;j>0;j--)
{
if(map[u][j]<inf)
{
if(d[j]>d[u]+map[u][j])
d[j]=d[u]+map[u][j];
}
}
}
printf("%d\n",d[1]);
}
return 0;
}
SPFA
#include<iostream>
#include<cstdio>
#include<string>
#include<queue>
#define inf 0x3f3f3f3f
using namespace std;
int map[1010][1010],d[1010],v[1010];
int t,n;
void spfa(int x)
{
d[x]=0;
v[x]=1;
queue<int>q;
q.push(x);
while(!q.empty())
{
int u=q.front();
q.pop();
v[u]=0;
for(int i=1;i<=n;i++)
{
if(d[i]>d[u]+map[u][i])
{
d[i]=d[u]+map[u][i];
if(!v[i])
{
q.push(i);
v[i]=1;
}
}
}
}
}
int main()
{
while(~scanf("%d%d",&t,&n))
{
for(int i=1;i<=n;i++)
{
d[i]=inf;
v[i]=0;
for(int j=1;j<=n;j++)
{
if(i==j)
map[i][j]=0;
else
map[i][j]=map[j][i]=inf;
}
}
int a,b,c;
for(int i=0;i<t;i++)
{
scanf("%d%d%d",&a,&b,&c);
if(map[a][b]>c)
map[a][b]=map[b][a]=c;
}
spfa(1);
printf("%d\n",d[n]);
}
return 0;
}