这个题目很变态,数据范围题目给错了,是远大于100,而且还有重边,即两个顶点有多条边连接,当权值不一样,只要取最小的那个就可以了,注意这几点就很容易AC了。
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn=1002;
const int inf=100000000;
bool visit[maxn];
int n,dist[maxn];
int w[maxn][maxn];
void Dijkstra(int v)
{
int i,j,u,min;
for(i=1;i<=n;i++)
if(i!=v)
dist[i]=w[v][i];
visit[v]=true;
for(i=1;i<n;i++)
{
min=inf;
for(j=1;j<=n;j++)
if(!visit[j] && dist[j]<min)
{
min=dist[j];
u=j;
}
visit[u]=true;
for(j=1;j<=n;j++)
if(!visit[j] && dist[u]+w[u][j]<dist[j])
dist[j]=dist[u]+w[u][j];
}
}
int main()
{
int i,j,t,x,y,a;
while(scanf("%d%d",&t,&n)!=EOF)
{
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
w[i][j]=inf;
for(i=1;i<=t;i++)
{
scanf("%d%d%d",&x,&y,&a);
if(a<w[x][y])
{
w[x][y]=a;
w[y][x]=w[x][y];
}
}
memset(visit,0,sizeof(visit));
Dijkstra(1);
printf("%d\n",dist[n]);
}
return 0;
}