zoukankan      html  css  js  c++  java
  • Buy a Ticket

    分析

    暴力做法是从每个点开始跑最短路,显然会T。
    进一步优化的话是将边权乘2,这样就不用跑回来了。
    但是还是不行,那么有没有办法可以跑一次最短路就解决了呢。
    开一个超级源点就行了。
    这样从这个点开始跑,一次Dij后得到的就是答案。

    #include<queue>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #define ll long long
    using namespace std;
    const int lqs=1e6+10;
    struct Edge{
    	int to,nxt;
    	ll val;
    }e[lqs];
    struct Node{
    	int id;ll val;
    	Node(){}
    	Node(int a,ll b){
    		id=a;val=b;
    	}
    	bool operator <(const Node &A)const{
    		return val>A.val;
    	}
    };
    int h[lqs],idx;
    void Ins(int a,int b,ll c){
    	e[++idx].to=b;e[idx].nxt=h[a];
    	h[a]=idx;e[idx].val=c;
    }
    ll dis[lqs];
    bool vis[lqs];
    void dij(){
    	priority_queue<Node> q;
    	q.push(Node(0,0));
    	memset(dis,0x3f,sizeof(dis));
    	dis[0]=0;
    	while(!q.empty()){
    		Node u=q.top();q.pop();
    		if(vis[u.id])continue;
    		vis[u.id]=1;
    		for(int i=h[u.id];i;i=e[i].nxt){
    			int v=e[i].to;
    			if(dis[v]>dis[u.id]+e[i].val){
    				dis[v]=dis[u.id]+e[i].val;
    				q.push(Node(v,dis[v]));
    			}
    		}
    	}
    }
    int main(){
    	int n,m;
    	scanf("%d%d",&n,&m);
    	for(int i=1;i<=m;i++){
    		int a,b;ll c;
    		scanf("%d%d%lld",&a,&b,&c);
    		Ins(a,b,c<<1);Ins(b,a,c<<1);
    	}
    	for(int i=1;i<=n;i++){
    		ll w;
    		scanf("%lld",&w);
    		Ins(0,i,w);
    	}
    	dij();
    	for(int i=1;i<=n;i++)
    		printf("%lld ",dis[i]);
    }
    
  • 相关阅读:
    C#面向对象编程进阶(一) ——实现栈
    Hibernate组件和关联映射
    创建多线程的两种方法
    Mybatis:ResultMap
    Mybatis:配置解析
    IDEA复制多行及对多行代码上下左右移动
    Mybatis:CRUD操作
    Mybatis简介
    算法分类 ,时间复杂度 ,空间复杂度,优化算法
    JAVA LOG4J使用方法
  • 原文地址:https://www.cnblogs.com/anyixing-fly/p/12968919.html
Copyright © 2011-2022 走看看