hdu1874

链接:点击打开链接

题意:求指定起点和指定终点的最短路

代码:

#include <cstdio>
#include <stdlib.h>
#include <string.h>
#include <iostream>
#include <queue>
#include <vector>
#include <algorithm>
#define INF 0x3f3f3f3f
using namespace std;
struct edge{
    int to,cost;
};
typedef pair<int,int> P;                //first代表最短距离,second代表顶点的编号
int V;
vector<edge> G[10005];
int d[10005];
void dijkstra(int s){
    int i,v;
	priority_queue<P,vector<P>,greater<P> >que;
	fill(d,d+V,INF);
	d[s]=0;
	que.push(P(0,s));
	while(!que.empty()){
		P p=que.top(); que.pop();
		v=p.second;
		if(d[v]<p.first)                        
        continue;
		for(i=0;i<G[v].size();i++){
			edge e=G[v][i];
			if(d[e.to]>d[v]+e.cost){
				d[e.to]=d[v]+e.cost;
				que.push(P(d[e.to],e.to));
			}
		}
	}
}                                       //白书上的dijkstra模板,用优先队列优化
int main(){
    int m,st,en,i,j,x,y,z;
    edge temp;
    while(scanf("%d%d",&V,&m)!=EOF){
        for(i=0;i<V;i++)
        G[i].clear();
        for(i=0;i<m;i++){
            scanf("%d%d%d",&x,&y,&z);
            temp.to=y;temp.cost=z;      //边是双向的,用vector建图不需要考虑重边
            G[x].push_back(temp);
            temp.to=x;
            G[y].push_back(temp);
        }
        scanf("%d%d",&st,&en);
        dijkstra(st);
        if(d[en]==INF)
        printf("-1\n");
        else
        printf("%d\n",d[en]);
    }
}

你可能感兴趣的:(hdu1874)