简单图论,求最短路径,可用dij算法,复杂度o(n^2)。
一开始wa,看了别人的题解后发现:在读入的时候,可能u,v之间有多条(直通)道路,取最小的存储即可。
#include<cstdio>
#include <cstring>
using namespace std;
#define MAX 205
#define MAX_DIS 10000000
int map[MAX][MAX],d[MAX],vis[MAX];
void dij(int n,int u)
{
for(int i=0; i<n; i++)
d[i]=map[u][i];
int min;
vis[u]=1;
for(int t=1; t<n; t++)
{
for(min=0;vis[min];min++);
for(int i=min+1; i<n; i++)
if(!vis[i]&&d[i]<d[min])
min=i;
vis[min]=1;
for(int i=0; i<n; i++)
{
if(d[min]+map[min][i]<d[i])
d[i]=d[min]+map[min][i];
}
}
}
void solve(int n,int m)
{
for(int i=0; i<n; i++)
for(int j=0; j<n; j++)
map[i][j]=MAX_DIS;
int x,y,z;
for(int i=0; i<m; i++)
{
scanf("%d%d%d",&x,&y,&z);
map[y][x]=map[x][y]=min(map[x][y],z); // 就是读入这里需要注意
}
scanf("%d%d",&x,&y);
memset(vis,0,sizeof(vis));
dij(n,x);
if(x==y)
printf("%d\n",0);
else if(d[y]<MAX_DIS)
printf("%d\n",d[y]);
else
printf("%d\n",-1);
}
int main()
{
int n,m;
while(scanf("%d%d",&n,&m)>0)
solve(n,m);
return 0;
}