• 【Vijos1404】遭遇战(最短路)


    【Vijos1404】遭遇战(最短路)

    题面

    Vijos

    题解

    显然可以树状数组之类的东西维护一下(dp)。这里考虑一种最短路的做法。
    首先对于一个区间([l,r]),显然可以连边((l,r+1)),那么最终的问题转化成了从(S)时刻到(E)时刻的最短路。发现显然并不在意一个时间可以被个线段覆盖,所以连边((i+1,i)),边权为(0)的边。

    #include<iostream>
    #include<cstdio>
    #include<cstdlib>
    #include<cstring>
    #include<queue>
    using namespace std;
    #define ll long long
    #define MAX 1000000
    inline int read()
    {
    	int x=0;bool t=false;char ch=getchar();
    	while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
    	if(ch=='-')t=true,ch=getchar();
    	while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
    	return t?-x:x;
    }
    struct Line{int v,next,w;}e[MAX];
    int h[MAX],cnt=1;
    inline void Add(int u,int v,int w){e[cnt]=(Line){v,h[u],w};h[u]=cnt++;}
    int n,S,E;ll dis[MAX];
    bool vis[MAX];
    void SPFA()
    {
    	memset(dis,63,sizeof(dis));
    	queue<int> Q;Q.push(S);dis[S]=0;
    	while(!Q.empty())
    	{
    		int u=Q.front();Q.pop();
    		for(int i=h[u];i;i=e[i].next)
    		{
    			int v=e[i].v;
    			if(dis[v]>dis[u]+e[i].w)
    			{
    				dis[v]=dis[u]+e[i].w;
    				if(!vis[v])Q.push(v),vis[v]=true;
    			}
    		}
    		vis[u]=false;
    	}
    }
    int main()
    {
    	n=read();S=read();E=read();
    	for(int i=1;i<=n;++i)
    	{
    		int u=read(),v=read(),w=read();
    		Add(max(S,u),min(E+1,v+1),w);
    	}
    	for(int i=S;i<=E+1;++i)Add(i,i-1,0);
    	SPFA();
    	printf("%lld
    ",dis[E+1]>=1e18?-1:dis[E+1]);
    	return 0;
    }
    
  • 相关阅读:
    scrapy.FormRequest与FormRequest.from_response 的区别
    可迭代对象和生成器
    css选择器
    xlwt写入excel时候的合并单元格
    html form提交的几种方式
    Python decorator 拦截器
    python manage.py makemigrations & migrate
    asianux4.5 环境, 本地yum源,局域网yum源的配置
    mysql基本操作
    sqlite-mysql migrate
  • 原文地址:https://www.cnblogs.com/cjyyb/p/9699174.html
Copyright © 2020-2023  润新知