• BZOJ1975 [Sdoi2010]魔法猪学院 k短路


    欢迎访问~原文出处——博客园-zhouzhendong

    去博客园看该题解


    题目传送门 - BZOJ1975


    题意概括

      给出一个无向图,让你走不同的路径,从1到n,路径长度之和不超过E,求最大路径条数。


    题解

      k短路模板题。


    代码

    #include <cstring>
    #include <cstdio>
    #include <algorithm>
    #include <cstdlib>
    #include <cmath>
    using namespace std;
    const int N=5005,M=200002;
    const double Inf=1e300;
    struct Gragh{
    	int cnt,y[M*2],nxt[M*2],fst[N],vis[N],q[N],n;
    	double z[M*2],dis[N];
    	void clear(int n_){
    		cnt=0,n=n_;
    		memset(fst,0,sizeof fst);
    	}
    	void add(int a,int b,double c){
    		y[++cnt]=b,z[cnt]=c,nxt[cnt]=fst[a],fst[a]=cnt;
    	}
    	void spfa(int st){
    		int X,Y,head=0,tail=0,qmod=N-3;
    		for (int i=1;i<=n;i++)
    			dis[i]=Inf;
    		memset(vis,0,sizeof vis);
    		dis[st]=0,vis[q[tail=tail%qmod+1]=st]=1;
    		while (head!=tail){
    			vis[X=q[head=head%qmod+1]]=0;
    			for (int i=fst[X];i;i=nxt[i])
    				if (dis[X]+z[i]<dis[Y=y[i]]){
    					dis[Y]=dis[X]+z[i];
    					if (!vis[Y])
    						vis[q[tail=tail%qmod+1]=Y]=1;
    				}
    		}
    	}
    }yg,g;
    const int S=2000000;
    int id[S],heap_size;
    double now[S];
    double h(int x){return g.dis[x];}
    double G(int x){return now[x]+h(id[x]);}
    void heap_clear(){heap_size=0;}
    bool heap_empty(){return heap_size==0;}
    bool heap_cmp(int a,int b){return G(a)<G(b);}
    void heap_down(){
    	for (int i=1,j=i<<1;j<=heap_size;i=j,j=i<<1){
    		j+=j<heap_size&&!heap_cmp(j,j+1);
    		if (heap_cmp(i,j))
    			break;
    		swap(id[i],id[j]),swap(now[i],now[j]);
    	}
    }
    void heap_up(){
    	for (int i=heap_size,j=i>>1;i>1;i=j,j=i>>1)
    		if (!heap_cmp(j,i))
    			swap(id[i],id[j]),swap(now[i],now[j]);
    		else
    			break;
    }
    void heap_pop(){
    	id[1]=id[heap_size];
    	now[1]=now[heap_size--];
    	heap_down();
    }
    void heap_push(int x,double nowdis){
    	id[++heap_size]=x;
    	now[heap_size]=nowdis;
    	heap_up();
    }
    int n,m;
    double E;
    int solve(){
    	int ans=0;
    	heap_clear();
    	heap_push(1,0);
    	while (!heap_empty()){
    		int x=id[1];
    		double nowdis=now[1];
    		heap_pop();
    		if (x==n){
    			if (nowdis>E)
    				return ans;
    			E-=nowdis;
    			ans++;
    			continue;
    		}
    		for (int i=yg.fst[x];i;i=yg.nxt[i]){
    			int y=yg.y[i];
    			heap_push(y,nowdis+yg.z[i]);
    		}
    	}
    }
    int main(){
    	scanf("%d%d%lf",&n,&m,&E);
    	g.clear(n),yg.clear(n);
    	for (int i=1;i<=m;i++){
    		int a,b;
    		double e;
    		scanf("%d%d%lf",&a,&b,&e);
    		yg.add(a,b,e);
    		g.add(b,a,e);
    	}
    	g.spfa(n);
    	printf("%d",solve());
    	return 0;
    }
    

      

  • 相关阅读:
    【转】一句话理解数据库索引
    ionic 2.x 3.x 打包 压缩
    编程命名规范之驼峰命名法、匈牙利命名法
    PowerDesigner的Name和Code不同步设置
    PowerDesigner执行脚本 name/comment/stereotype互转
    【转】PowerDesigner快捷键
    ionic 2.x 3.x input触发调用键盘搜索及事件
    ionic 2.x 3.x项目结构解析
    nginx windown命令
    ionic3.x angular4.x ng4.x 自定义组件component双向绑定之自定义计数器
  • 原文地址:https://www.cnblogs.com/zhouzhendong/p/BZOJ1975.html
Copyright © 2020-2023  润新知