zoukankan      html  css  js  c++  java
  • P4779 【模板】单源最短路径

    题目地址


    注意点:

    • 源点需要设置初始距离(0).
    • 优先队列默认是从大到小排序,因此需要重载运算符.

    #include<cstdio>
    #include<iostream>
    #include<queue>
    using namespace std;
    const int MAXN=1000010,MAXM=1000010;
    struct Edge{
    	int from,to,w,nxt;
    }e[MAXM];
    int head[MAXN],edgeCnt=1;
    void addEdge(int u,int v,int w){
    	e[++edgeCnt].from=u;
    	e[edgeCnt].to=v;
    	e[edgeCnt].w=w;
    	e[edgeCnt].nxt=head[u];
    	head[u]=edgeCnt;
    }
    int s;
    struct Node{
    	int nowPoint,dis;
    	bool operator <(Node another)const{
    		return dis>another.dis;
    	}
    };
    int dis[MAXN];
    void dijkstra(){
    	priority_queue<Node> q;
    	q.push(Node{s,0});
    	dis[s]=0;
    	while(!q.empty()){
    		Node nowNode=q.top();q.pop();
    		int nowPoint=nowNode.nowPoint,nowDis=nowNode.dis;
    		if(nowDis>dis[nowPoint])continue;
    		for(int i=head[nowPoint];i;i=e[i].nxt){
    			int nowV=e[i].to;
    			if(dis[nowPoint]+e[i].w<dis[nowV]){
    				q.push(Node{nowV,dis[nowPoint]+e[i].w});
    				dis[nowV]=dis[nowPoint]+e[i].w;
    			}
    		}
    	}
    }
    const int INF=2e9;
    int main(){
    	int n,m;
    	scanf("%d%d%d",&n,&m,&s);
    	for(int i=1;i<=n;i++)dis[i]=INF;
    	for(int i=1;i<=m;i++){
    		int u,v,w;
    		scanf("%d%d%d",&u,&v,&w);
    		addEdge(u,v,w);
    	}
    	dijkstra();
    	for(int i=1;i<=n;i++){
    		printf("%d ",dis[i]);
    	}
    	printf("
    ");
    	return 0;
    }
  • 相关阅读:
    SQL Server 2005 出现“此数据库没有有效所有者”错误的解决方法
    使用swfupload出现SecurityError Error #2156问题
    读取Excel表
    POJ 1953 (DP)
    POJ 1050 (DP)
    POJ 1276 (DP)
    POJ 1579 (DP)
    HDOJ 4223 (DP)
    POJ 1080 (DP)
    POJ 1458 (DP)
  • 原文地址:https://www.cnblogs.com/zbsy-wwx/p/11680619.html
Copyright © 2011-2022 走看看