这个题目就是个裸的Dijkstra算法,为嘛我考虑了双向边和重边以后wa了那么多次,弄的我整个人心情都不好了,重写了那么多次才过,而且还不知道哪出了问题就过了,只能对自己说:年轻人,淡定……
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int INF = 0x3f3f3f3f;
const int N = 1005;
int e[N][N],dis[N],book[N];
int main()
{
int n,m;
while(~scanf("%d%d",&m,&n))
{
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(i==j) e[i][j]=0;
else e[i][j]=INF;
int t1,t2,t3;
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&t1,&t2,&t3);
if(e[t1][t2]>t3)
e[t1][t2]=e[t2][t1]=t3;//双向边
}
//初始化dis数组,哲理是1号顶点到其余各顶点的初始路程
for(int i=1;i<=n;i++)
dis[i]=e[1][i];
memset(book,0,sizeof(book));//初始化
book[1]=0;//因为1点是源点
int minn,u,v;
//Dijkstra算法核心语句
for(int i=1;i<=n-1;i++)//n-1
{
//找到离1号顶点最近的顶点
//是每次都要找
minn=INF;
for(int j=1;j<=n;j++)
{
if(book[j]==0&&dis[j]<minn)
{
minn=dis[j];
u=j;
}
}
book[u]=1;//一个新的起点
for(v=1;v<=n;v++)
{
if(e[u][v]<INF)
{
if(dis[v]>dis[u]+e[u][v])
dis[v]=dis[u]+e[u][v];
}
}
}
//输出
printf("%d\n",dis[n]);
}
return 0;
}