图论专题HDU-1874 畅通工程续

畅通工程续(dijkstra算法或Floyd算法)

题面
某省自从实行了很多年的畅通工程计划后,终于修建了很多路。不过路多了也不好,每次要从一个城镇到另一个城镇时,都有许多种道路方案可以选择,而某些方案要比另一些方案行走的距离要短很多。这让行人很困扰。

现在,已知起点和终点,请你计算出要从起点到终点,最短需要行走多少距离。

Input
本题目包含多组数据,请处理到文件结束。

每组数据第一行包含两个正整数N和M(0

接下来是M行道路信息。每一行有三个整数A,B,X(0<=A,B

再接下一行有两个整数S,T(0<=S,T

Output
对于每组数据,请在一行里输出最短需要行走的距离。如果不存在从S到T的路线,就输出-1.

Sample Input

3 3
0 1 1
0 2 3
1 2 1
0 2
3 1
0 1 1
1 2

Sample Output

2
-1

题目分析
dijkstra+优先队列优化解最短路问题模板,将起点到城镇距离设为INF,每发现更近的路则更新。最后判断起点终点距离是否为INF,是则证明不可达,否则输出答案。

代码

#include
#include
#include
#include
#include
#include
#define INF 1000000000

using namespace std;

struct edge{
	int to,cost;
};

typedef pair<int,int > P;//first是最短距离,second是顶点编号 

int N,M;
vector<edge> G[105];   //G[v]存与v点相连的边 

int d[105];            //d[v]记录到v点最短距离 

void dijkstra(int s)
{
    //通过指定greater

参数,堆按照first从小到大的顺序取出值 priority_queue< P , vector<P> , greater<P> > que; fill(d,d+N,INF); //注意初始化的区间要覆盖路径 d[s] = 0; que.push( P(0,s) ); while(!que.empty()){ P p=que.top();que.pop(); int v=p.second;//v为从v点出发 if(d[v]<p.first) continue; for(int i=0;i< G[v].size();i++){ edge e=G[v][i]; if(d[e.to]>d[v]+e.cost){ //遍历与v相接边找出与v下一点 d[e.to]=d[v]+e.cost; //最短距离放至vector中 que.push( P(d[e.to],e.to) ); //【vector 按first小到大取出值】 } } } } int main() { while(~scanf("%d%d",&N,&M)) { for(int i=0;i<N;i++)G[i].clear();//初始化!!! while(M--) { int A,B,C; scanf("%d%d%d",&A,&B,&C); edge E; E.to=B;E.cost=C; G[A].push_back(E); E.to=A; G[B].push_back(E); } int S,T; scanf("%d%d",&S,&T); dijkstra(S); if(d[T]==INF){ printf("-1\n"); }else{ printf("%d\n",d[T]); } } return 0; }

你可能感兴趣的:(图论专题)