• 【GDOI 2016 Day2】第一题 SigemaGO


    题目

    这里写图片描述

    分析

    拆点连边+spfa。
    首先把图分成2lim+1层,也就是每个点拆成2lim+1个点。
    如果a和b之间、b和c有一条有向边,那么连边(k,a)-->(k+1,b),(k+1,b)-->(k+2,c)(k=1、3、5、···、2lim+1,是当前点所在的层数),这两条边的权值和是l。也就是说当走了(k,a)-->(k+1,b)-->(k+2,c)这条路线时,就是抄了一次近道。
    注意:在spfa中,当走到的点在第2、4、6、···、2lim层时,就只能往上走,因为当前点一定在抄近道的过程中。

    #include <cmath>
    #include <iostream>
    #include <cstdio>
    #include <cstdlib>
    #include <cstring>
    #include <algorithm>
    #include <queue>
    const int maxlongint=2147483647;
    using namespace std;
    int next[800000],last[800000],to[800000],dis[13][200000],n,m,lim,l,tot,v[800000],ans,d[10000000][2];
    bool bz[200000];
    int bj(int x,int y,int z)
    {
    	next[++tot]=last[x];
    	last[x]=tot;
    	to[tot]=y;
    	v[tot]=z;
    }
    int spfa()
    {
    	int i,j,head=0,tail=1,k;
    	d[1][0]=0;
    	d[1][1]=1;
    	dis[0][1]=0;
    	while(head<tail)
    	{
    		k=++head;
    		bz[d[k][0]*n+d[k][1]]=true;
    		for(i=last[d[k][1]+n*d[k][0]];i;i=next[i])
    		{
    			j=to[i];
    			int x=(j-1)/n;
    			if(dis[x][(j-1)%n+1]>dis[d[k][0]][d[k][1]]+v[i])
    			{
    				dis[x][(j-1)%n+1]=dis[d[k][0]][d[k][1]]+v[i];
    				if(bz[j])
    				{
    					bz[j]=false;
    					d[++tail][0]=x;
    					d[tail][1]=(j-1)%n+1;
    				}
    			}
    		}
    	}
    }
    int main()
    {
    	freopen("sigemago.in","r",stdin);
    	freopen("sigemago.out","w",stdout);
    	scanf("%d%d%d%d",&n,&m,&l,&lim);
    	for(int i=1;i<=m;i++)
    	{
    		int x,y,z;
    		scanf("%d%d%d",&x,&y,&z);
    		for(int j=1;j<=lim+1;j++)
    		{
    			bj(x+n*(j*2-2),y+n*(j*2-2),z);
    		}
    		for(int j=1;j<=lim*2;j++)
    		{
    			bj(x+n*(j-1),y+n*j,l*(j%2));
    		}
    	}
    	memset(dis,60,sizeof(dis));
    	memset(bz,true,sizeof(bz));
    	spfa();
    	ans=maxlongint;
    	for(int i=1;i<=lim+1;i++)
    	{
    		if(ans>dis[i*2-2][n]) ans=dis[i*2-2][n];
    	}
    	if(ans>=dis[0][0])	printf("-1
    ");
    	else
    	printf("%d
    ",ans);
    }
    
    
    
  • 相关阅读:
    git使用小结
    关于vtordisp知多少?
    虚函数与虚继承寻踪
    最简git Server配置
    StarUML序
    CacheHelper对缓存的控制
    Web Service的一些经验和技巧总结
    月份信息二维坐标图绘制(绘制箭头算法)续
    dynamic与xml的相互转换
    如何将XML与OBJECT进行相互转换(泛型以及通用方法)
  • 原文地址:https://www.cnblogs.com/chen1352/p/9026687.html
Copyright © 2020-2023  润新知