zoukankan      html  css  js  c++  java
  • [Code+#4]最短路

    考虑xor运算的自反性

    我们可以直接枚举二进制位异或来进行转移

    这样边数大约是(n log n)级别的

    总复杂度(Theta((nlog n+m)log n))

    #include"cstdio"
    #include"cstring"
    #include"iostream"
    #include"algorithm"
    using namespace std;
    
    const int MAXN=1e5+5;
    const int MAXM=5e5+5;
    
    int n,m,c,np,s,t;
    int h[MAXN],hp[MAXN],ln[MAXN],id[MAXN];
    struct rpg{
    	int li,nx,ln;
    }a[MAXM];
    
    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=i>>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]);
    	return;
    }
    
    void pop()
    {
    	id[hp[1]]=0;
    	hp[1]=hp[hp[0]--];
    	id[hp[1]]=1;
    	for(int i=1,j=2;j<=hp[0];i=j,j<<=1){
    		if(j<hp[0]&&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(int s)
    {
    	memset(ln,0x7f,sizeof(ln));
    	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]) up(id[a[i].nx]);
    				else ins(a[i].nx);
    			}
    		}for(int i=1;i<=n;i<<=1){
    			int tmp=nw^i;
    			if(tmp>n) continue;
    			if(ln[tmp]>ln[nw]+i*c){
    				ln[tmp]=ln[nw]+i*c;
    				if(id[tmp]) up(id[tmp]);
    				else ins(tmp);
    			}
    		}
    	}return;
    }
    
    int main()
    {
    	scanf("%d%d%d",&n,&m,&c);
    	for(int i=1;i<=m;++i){
    		int x,y,z;scanf("%d%d%d",&x,&y,&z);
    		add(x,y,z);
    	}scanf("%d%d",&s,&t);
    	Dijkstra(s);printf("%d
    ",ln[t]);
    	return 0;
    }
    
  • 相关阅读:
    wpf Behavior
    wpf Trigger
    语法糖
    Lambda 表达式
    wpf 3D动画
    IEnumerable接口学习
    Delegates, Events, and Anonymous Methods 委托、事件与匿名方法
    wpf 平滑效果随记
    软件工程第一篇博客
    记考研高数第一课
  • 原文地址:https://www.cnblogs.com/AH2002/p/10064179.html
Copyright © 2011-2022 走看看