• 赛艇表演【最短路】


    题目:

    在这里插入图片描述


    思路:

    由于如果要经过一条道路就肯定会经过两次,所以我们直接将所有边的边权乘2即可。
    然后我们把每一个点的disdis设为在该地看比赛的价格。然后将每一个点扔进优先队列内跑最短路即可。如果一个地点经过某一条道路到另外的地点观看比赛会更优,那么最短路就可以跑出来。
    最终答案就是disdis


    代码:

    #include <queue>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #define mp make_pair
    using namespace std;
    typedef long long ll;
    
    const int N=200010;
    int n,m,tot,head[N];
    ll dis[N];
    bool vis[N];
    
    struct edge
    {
    	int next,to;
    	ll dis;
    }e[N*2];
    
    void add(int from,int to,ll dis)
    {
    	e[++tot].to=to;
    	e[tot].dis=dis;
    	e[tot].next=head[from];
    	head[from]=tot;
    }
    
    void dij()
    {
    	priority_queue<pair<int,ll> > q;
    	for (int i=1;i<=n;i++)
    	{
    		scanf("%d",&dis[i]);
    		q.push(mp(-dis[i],i));
    	}
    	while (q.size())
    	{
    		int u=q.top().second;
    		q.pop();
    		if (vis[u]) continue;
    		vis[u]=1;
    		for (int i=head[u];~i;i=e[i].next)
    		{
    			int v=e[i].to;
    			if (dis[v]>dis[u]+e[i].dis)
    			{
    				dis[v]=dis[u]+e[i].dis;
    				q.push(mp(-dis[v],v));
    			}
    		}
    	}
    }
    
    int main()
    {
    	memset(head,-1,sizeof(head));
    	scanf("%d%d",&n,&m);
    	for (int i=1;i<=m;i++)
    	{
    		int x,y; ll z;
    		scanf("%d%d%lld",&x,&y,&z);
    		add(x,y,z*2); add(y,x,z*2);
    	}
    	dij();
    	for (int i=1;i<=n;i++)
    		printf("%lld ",dis[i]);
    	return 0;
    }
    
  • 相关阅读:
    【分享】你敢来挑战?程序员等级
    [css]我要用css画幅画(二)
    [css]我要用css画幅画(一)
    关于学习javascript的一些建议
    孩子们眼中的世界
    全职妈妈再就业辅助计划
    程序员如何打扫卫生并向老婆汇报
    《夏洛特烦恼》观后感
    软件开发之: 做“工程”还是做“艺术品”
    2014年年度总结
  • 原文地址:https://www.cnblogs.com/hello-tomorrow/p/11997985.html
Copyright © 2020-2023  润新知