zoukankan      html  css  js  c++  java
  • P4779 【模板】单源最短路径(标准版)

    单源最短路径模板题,没什么好说的。

    然而本题卡普通SPFA.....

    昨天某位同学给我说了堆优化SPFA.... 于是就拿来写这道题,A了

    堆优化思想就是把dis小的放在前边,也许和SLF优化差不多? 然而感觉上比SLF快很多

    #include<algorithm>
    #include<iostream>
    #include<cstring>
    #include<cstdio>
    #include<queue>
    using namespace std;
    
    bool inque[400100];
    int to[400100],nex[400100],val[400100],head[400100],dis[400100];
    struct cmp
    {
    	bool operator () (int &x,int &y)
    	{
    		return dis[x]>dis[y];
    	}
    };
    priority_queue <int,vector<int>,cmp> q;
    char buf[1000100];
    
    inline char nc()
    {
    	static char buf[1000000],*p1=buf,*p2=buf;
    	return p1==p2&&(p2=(p1=buf)+fread(buf,1,1000000,stdin),p1==p2)?EOF:*p1++;
    }
    
    inline int read()
    {
    	int sum=0;
    	char ch=nc();
    	while(!isdigit(ch))
    		ch=nc();
    	while(isdigit(ch))
    	{
    		sum=(sum<<3)+(sum<<1)+(ch^48);
    		ch=nc();
    	}
    	return sum;
    }
    
    inline void putd(int x)
    {
    	int p=0;
    	if(x<0)
    	{
    		putchar('-');
    		x=-x;
    	}
    	do
    	{
    		buf[p++]=x%10;
    		x/=10;
    	}while(x);
    	for(register int i=p-1;i>=0;i--)
    		putchar(buf[i]+'0');
    	putchar(' ');
    }
    
    void spfa(int s)
    {
    	int now;
    	inque[s]=true;
    	q.push(s);
    	dis[s]=0;
    	while(!q.empty())
    	{
    		now=q.top();
    		q.pop();
    		inque[now]=false;
    		for(register int i=head[now]; i; i=nex[i])
    		{
    			if(dis[to[i]]>dis[now]+val[i])
    			{
    				dis[to[i]]=dis[now]+val[i];
    				if(!inque[to[i]])
    				{
    					inque[to[i]]=true;
    					q.push(to[i]);
    				}
    			}
    		}
    	}
    	return ;
    }
    
    int main()
    {
    	int n,m,s,f,t,v;
    	n=read();
    	m=read();
    	s=read();
    	memset(dis,0x7f,sizeof(dis));
    	for(register int i=1; i<=m; i++)
    	{
    		f=read();
    		t=read();
    		v=read();
    		to[i]=t;
    		val[i]=v;
    		nex[i]=head[f];
    		head[f]=i;
    	}
    	spfa(s);
    	for(register int i=1; i<=n; i++)
    		putd(dis[i]);
    	return 0;
    }
    
  • 相关阅读:
    [linux]CentOS防火墙
    [工具]VIM键位
    [mac]mac 终端 常用命令
    [数据结构]“堆”,"栈","堆栈","队列"的区别
    [java]Java构造方法与析构方法
    [环境]Eclipse安装WindowBuilder
    [BZOJ 1441]Min(裴蜀定理)
    [BZOJ 4563][Haoi2016]放棋子(错排公式)
    [BZOJ 4517][Sdoi2016]排列计数(组合数学/错排公式)
    [BZOJ 3680]吊打XXX(模拟退火)
  • 原文地址:https://www.cnblogs.com/Alarak26/p/9374245.html
Copyright © 2011-2022 走看看