题号不错。。再来水一道
发现这种类型题目很多坑 比如有没有给重边啊 比如对起点的处理。。
#include <iostream>
#include <cstring>
#include <string>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <vector>
#include <queue>
#include <map>
#define inf 0x3f3f3f3f
using namespace std;
int n,m,sta,end,dis[210][210],d[210],vis[210];
void dij(int a,int b)
{
int i,j,k,mm;
memset(vis,0,sizeof vis);
for(i=0;i<n;i++)
d[i]=dis[a][i];
vis[a]=1;d[a]=0;//dis[a][a]=inf
for(i=0;i<n;i++)
{
mm=inf;k=201;
for(j=0;j<n;j++)
{
if(!vis[j]&&d[j]<mm)
{
mm=d[j];
k=j;
}
}
if(k==b) break;
vis[k]=1;
for(j=0;j<n;j++)
{
if(!vis[j]&&(mm+dis[k][j]<d[j]))
d[j]=dis[k][j]+mm;
}
}
}
int main()
{
int u,v,w,i,j;
while(~scanf("%d%d",&n,&m))
{
memset(dis,0x3f,sizeof dis);
for(i=0;i<m;i++)
{
scanf("%d%d%d",&u,&v,&w);
if(w<dis[u][v]) dis[u][v]=dis[v][u]=w;//第一个wa点
}
scanf("%d%d",&sta,&end);
/*if(sta==end)//虽然题目说了STA!=END 但我加上为什么就WA?!
{
printf("-1\n");
continue;
}*/
dij(sta,end);
printf("%d\n",d[end]==inf?-1:d[end]);
}
return 0;
}