zoukankan      html  css  js  c++  java
  • 手写堆优化dijkstra

    (dijkstra) 算法的堆优化,时间复杂度为(O(n+m)log n)
    添加数组(id[])记录某节点在堆中的位置,可以避免重复入堆从而减小常数
    而这一方法需要依托手写堆

    #include"cstdio"
    #include"cstring"
    #include"iostream"
    #include"algorithm"
    #include"bitset"
    using namespace std;
    
    const int MAXN=1e5+5;
    const int INF=2e9;
    
    int n,m,s,np;
    int hp[MAXN],h[MAXN],ln[MAXN],id[MAXN];
    struct rpg{
    	int li,nx,ln;
    }a[MAXN<<1];
    
    inline int read()
    {
    	int x=0;char ch=getchar();
    	while(ch<'0'||'9'<ch) ch=getchar();
    	while('0'<=ch&&ch<='9') x=(x<<3)+(x<<1)+(ch^'0'),ch=getchar();
    	return x;
    }
    
    inline void add(int ls,int nx,int ln){a[++np]=(rpg){h[ls],nx,ln};h[ls]=np;}
    
    void up(int x)
    {
    	for(int i=x,j=x>>1;j;i=j,j>>=1){
    		if(ln[hp[i]]<ln[hp[j]]) swap(hp[i],hp[j]),swap(id[hp[i]],id[hp[j]]);
    		else break;
    	}return;
    }
    
    void ins(int x){hp[++hp[0]]=x;id[x]=hp[0];up(hp[0]);}
    
    void pop()
    {
    	id[hp[1]]=0;id[hp[hp[0]]]=1;
    	hp[1]=hp[hp[0]--];
    	for(int i=1,j=2;j<=hp[0];i=j,j<<=1){
    		if(ln[hp[j+1]]<ln[hp[j]]) ++j;
    		if(ln[hp[i]]>ln[hp[j]]) swap(hp[i],hp[j]),swap(id[hp[i]],id[hp[j]]);
    		else break;
    	}return;
    }
    
    void dijkstra()
    {
    	for(int i=1;i<=n;++i) ln[i]=INF;
    	ln[s]=0;ins(s);
    	while(hp[0]){
    		int nw=hp[1];pop();
    		for(int i=h[nw];i;i=a[i].li){
    			if(ln[a[i].nx]>ln[nw]+a[i].ln){
    				ln[a[i].nx]=ln[nw]+a[i].ln;
    				if(!id[a[i].nx]) ins(a[i].nx);
    				else up(id[a[i].nx]);
    			}
    		}
    	}return;
    }
    
    int main()
    {
    	n=read(),m=read(),s=read();
    	for(int i=1;i<=m;++i){
    		int x=read(),y=read(),z=read();
    		add(x,y,z);
    	}dijkstra();
    	for(int i=1;i<=n;++i) printf("%d ",ln[i]);
    	return 0;
    }
    
  • 相关阅读:
    zepto的源代码注释(转)
    关于js的连续赋值
    一道js题
    深入理解setTimeout的作用域
    深入理解setTimeout和setinterval
    webapp之路--apple私有属性apple-touch-icon
    javascript中的原型继承
    webapp之路--百度手机前端经验(转)
    (转)浏览器的渲染原理
    node.js study: cluster
  • 原文地址:https://www.cnblogs.com/AH2002/p/9632705.html
Copyright © 2011-2022 走看看