原题
http://acm.hdu.edu.cn/showproblem.php?pid=1874
这道题目的大意就是求两点之间的距离。在求最短路的时候最好要用spfa。这个算法运行的时间快。
spfa算法的核心思想就是构建一个队列,先进先出的队列,要记住,每次出来的时候都要给点重新标记下
因为这个店还有可能继续进入到这个队列里面。
在计算的时候要给每个点的花费赋值为无穷大,除了起点为0
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <limits.h>
#include <malloc.h>
#include <ctype.h>
#include <math.h>
#include <string>
#include <iostream>
#include <algorithm>
using namespace std;
#include <stack>
#include <queue>
#include <vector>
#include <deque>
#include <set>
#include <map>
#define INF 9999999
int n,s,t;
int cost[220];
int vis[220];
int dis[220][220];
void spfa()
{
int x,i;
int q[220];//相当于优先队列
int rear=0,front=0;
memset(vis,0,sizeof(vis));
memset(q,0,sizeof(q));
cost[s] = 0;
vis[s] = 1;
q[++rear] =s;//一定要写成这样,不能写成rear++,因为前面那样写就是给1赋值,为了后面取的时候方便
while(front!=rear)
{
front = (front+1)%(n+1);//可以理解成为模板
x = q[front];
vis[x] = 0;//出来就要标记,因为出来的点后面还是可以继续进去的
for(i=0;i<n;i++){
if(cost[x]+dis[x][i] < cost[i])//spfa算法中最重要的一部
{
cost[i] = cost[x]+dis[x][i];
if(vis[i]==0)
{
rear = (rear+1)%(n+1);
q[rear] = i;
vis[i] = 1;
}
}
}
}
}
int main()
{
int m;
int i,j,k;
int a,b,d;
while(~scanf("%d%d",&n,&m))
{
memset(dis,0,sizeof(dis));
memset(cost,0,sizeof(cost));
for(i=0;i<n;i++){
for(j=0;j<n;j++){
dis[i][j] = INF;
}
}
for(i=0;i<m;i++){
scanf("%d%d%d",&a,&b,&d);
if(dis[a][b] > d){
dis[a][b] = dis[b][a] = d;
}
}
scanf("%d%d",&s,&t);
for(i=0;i<n;i++)
cost[i] = INF;
spfa();
if(cost[t] < INF)
printf("%d\n",cost[t]);
else
printf("-1\n");
}
return 0;
}