【题目链接】
http://acm.hdu.edu.cn/showproblem.php?pid=1874
题目意思
题目意思给你n个点和m条路,每条路都有对应的权值,现在问你从s(起始点)到t(终点)最短路径,如果没有输出-1
解题思路
非常简单最短路的模板题,没什么要说的
代码部分
#include <bits/stdc++.h>
using namespace std;
#define LL long long
const int maxn=205;
const int INT=0x3f3f3f;
int n,m;
int a[maxn][maxn]; ///地图
int vis[maxn];
int dis[maxn]; ///存最短路径
int Dis(int s,int t)
{
memset(vis,0,sizeof(vis));
vis[s]=1;
int j;
int mi=INT;
for (int i=0; i<n; i++) ///更新最短路径数组并找出离根最近的点
{
dis[i]=a[s][i];
if (a[s][i]<mi&&!vis[i])
{
mi=a[s][i];
j=i;
}
}
if (mi!=INT)
{
dis[j]=mi;
}
else
return -1;
for (int i=0; i<n; i++)
{
s=j;
mi=INT;
vis[j]=1;
if (j==t)
return dis[t];
for (int k=0; k<n; k++)
{
if (!vis[k]) ///跟新最短数组
{
if (a[s][k]+dis[s]<dis[k])
dis[k]=a[s][k]+dis[s];
//cout << dis[k] << endl;
}
}
for (int k=0; k<n; k++) ///寻找最近点
{
if (dis[k]<mi&&!vis[k])
{
mi=dis[k];
j=k;
}
}
if (mi==INT)
return -1;
}
return -1;
}
int main()
{
while(scanf("%d %d",&n,&m)!=EOF)
{
memset(a,INT,sizeof(a));
memset(dis,INT,sizeof(dis));
for (int i=0; i<m; i++)
{
int A,B,x;
scanf("%d %d %d",&A,&B,&x);
if (x<a[A][B]) ///双向路
{
a[A][B]=x;
a[B][A]=x;
}
}
int s,t;
scanf("%d %d",&s,&t);
if (s==t)
cout<<0<<endl;
else
{
int d=Dis(s,t);
cout<<d<<endl;
}
}
return 0;
}