sgu-301. Boring. Hot. Summer...

Description:

给你一个 N 个点,M 条边的无向图,规定了起点 S 和终点 T ,一个人从点 S 出发去 T ,每一条 S 到 T 的最短路叫做关键路径,属于关键路径上的点称为关键点。假设每个单位时间可以移动 1 的长度。对于第 i 个点,如果其不是关键点,输出 “0”,否则假设从 S 到 i 时间为 Ti,输出在时间为 Ti 时,这个人可能在哪些位置上(PS:位置的定义和图的节点定义不同,不但可以站在节点上,还可以站在边上,比如一条长度为7的边,你可以站在其中长度为1,2,3,4,5,6的地方而不仅仅是长度为 0,7 的两端)。

Solution:

首先跑一边最短路找出哪些点和哪些边在关键路径上,然后我们对于所有在关键路径上的边,假设两个端点为 u,v(dist[u]<dist[v]) ,那么我们就把 dist[u]~dist[v]的答案区间加一。

Code:

#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <iostream>

using namespace std;

const int Mod=131071;

int N,S,T;
int M;
int dist[2010]={0};
int st=1,en=0;
int num=0;
int hash[2010]={0};
int dui[131100]={0};
int D[2010]={0};
int Sum[2010]={0};
int Sp=0;

struct bian_
{
    int st;
    int to;
    int next;
    int dis;
}bian[400010]={{0,0,0,0}};
int First[2010]={0};
int vis[2010]={0};

void Add(int p,int q,int r,int k)
{
    bian[k].next=First[p];
    bian[k].st=p;
    bian[k].to=q;
    bian[k].dis=r;
    First[p]=k;
    return;
}

void SPFA()
{
    memset(dist,0x3f3f3f3f,sizeof(dist));
    dui[++en]=S;
    dist[S]=0;
    num=1;
    for(;num>0;)
    {
        int u=dui[st];
        st=(st&Mod)+1;
        hash[u]=0;num--;
        for(int i=First[u];i!=0;i=bian[i].next)
        {
            int v=bian[i].to;
            if(dist[v]>dist[u]+bian[i].dis)
            {
                dist[v]=dist[u]+bian[i].dis;
                if(hash[v]==0)
                {
                    hash[v]=1;
                    if(dist[v]<dist[dui[st]])
                    {
                        st=((st+Mod-1)&Mod)+1;
                        dui[st]=v;
                    }
                    else
                    {
                        en=(en&Mod)+1;
                        dui[en]=v;
                    }
                    num++;
                }
            }
        }
    }
    return;
}

int Find(int k)
{
    for(int l=1,r=Sp;l<=r;)
    {
        int mid=(l+r)>>1;
        if(D[mid]==k) return mid;
        if(D[mid]<k) l=mid+1;
        else r=mid-1;
    }
    return 0;
}

int main()
{
    scanf("%d%d%d",&N,&S,&T);
    scanf("%d",&M);
    for(int i=1;i<=M;i++)
    {
        int p,q,r;
        scanf("%d%d%d",&p,&q,&r);
        Add(p,q,r,(i<<1)-1);
        Add(q,p,r,i<<1);
    }
    SPFA();
    for(int i=1;i<=N;i++)
        D[++Sp]=dist[i];
    sort(D+1,D+N+1);
    Sp=1;
    for(int i=2;i<=N;i++)
        if(D[i]!=D[i-1])
            D[++Sp]=D[i];
    for(int i=Sp+1;i<=N;i++) D[i]=0;
    en=1;
    dui[1]=T;
    for(int i=1;i<=en;i++)
    {
        int u=dui[i];
        for(int p=First[u];p!=0;p=bian[p].next)
        {
            int v=bian[p].to;
            if(dist[u]==dist[v]+bian[p].dis)
            {
                int L=Find(dist[v]),R=Find(dist[u]);
                vis[v]=vis[u]=1;
                Sum[L+1]++,Sum[R]--;
                if(hash[v]==0)
                    dui[++en]=v,hash[v]=1;
            }
        }
    }
    for(int i=1;i<=Sp;i++)
        Sum[i]+=Sum[i-1];
    for(int i=1;i<=N;i++)
        if(vis[i]==1)
            Sum[Find(dist[i])]++;
    for(int i=1;i<=N;i++)
    {
        int p=Find(dist[i]);
        printf("%d ",Sum[p]*vis[i]);
    }
    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-10 15:10:42

sgu-301. Boring. Hot. Summer...的相关文章

【SGU 390】Tickets (数位DP)

Tickets Description Conductor is quite a boring profession, as all you have to do is just to sell tickets to the passengers. So no wonder that once upon a time in a faraway galaxy one conductor decided to diversify this occupation. Now this conductor

http协议的状态码 200、301、304、404、502 HTTP状态码解释

在网站建设的实际应用中,容易出现很多小小的失误,就像mysql当初优化不到位,影响整体网站的浏览效果一样,其实,网站的常规http状态码的表现也是一样,Google无法验证网站几种解决办法,提及到由于404状态页面设置不正常,导致了google管理员工具无法验证的情况,当然,影响的不仅仅是这一方面,影响的更是网站的整体浏览效果.因此,比较清楚详细的了解http状态码的具体含义,对于一个网站站长来说,这是很有必要俱备的网站制作基础条件. 如果某项请求发送到您的服务器要求显示您网站上的某个网页(例如

http协议301、302的原理和实现

最近在配合其他团队对网站进行seo方面的优化,其中建议需要对url进行大量301修改,基本就是将原来的较长的url重新定向到一个比较短的url,提高对搜索引擎的友好程序,如果发现你的网页从一个很简精简的url被定向到一个冗长的url上,可能是被劫持了,对于google比较智能的搜索引擎,它还会接受之前的那个精简的,因为它更加友好化.今天就把这个http的301返回码分析一下. HTTP协议301返回码:简单的说就是永久重定向(Permanently Moved) HTTP协议302返回码:简单的

http响应状态码301和302

HTTP返回码中301与302的区别 (2012-10-15 22:06:09) 转载▼ 标签: 杂谈 分类: 前台页面控制 一.官方说法 301,302 都是HTTP状态的编码,都代表着某个URL发生了转移,不同之处在于: 301 redirect: 301 代表永久性转移(Permanently Moved). 302 redirect: 302 代表暂时性转移(Temporarily Moved ). 这是很官方的说法,那么它们的区别到底是什么呢? 二.现实中的差异 2.1.对于用户 30

apache域名301跳转和访问控制的优先级

apache域名301跳转和访问控制的优先级 实验背景:apache虚拟主机有两个域名 111.com 222.com 其中222.com 访问的时候跳转到111.com,并且给该虚拟主机做了访问控制,只允许127.0.0.1访问.问题:当访问222.com时,它是先跳转到111.com,还是直接403呢? 打开apache中虚拟主机配置文件: vim /usr/local/apache2/conf/extra/httpd-vhosts.conf,可以看到当前配置如下(没做访问控制措施): 我们

lamp默认虚拟主机和301跳转

在实验中我们发现,无论我们使用哪个域名都可以的,而且出现一个情况,我们只是在hosts文件中将某一域名与自己的ip对应,配置中并没有这个域名,也可以登录我们的discuz界面,这个并不是我们想要的.所以我们需要设定一个默认虚拟主机来将诸如此类的访问拦截. 我们只需要在配置文件httpd-vhost.conf中,在我们设置的虚拟主机前再添加一个,配置如下. # vim /usr/local/apache2/conf/extra/httpd-vhosts.conf <VirtualHost *:80

hihoCoder 1430 : A Boring Problem(一琐繁题)

hihoCoder #1430 : A Boring Problem(一琐繁题) 时间限制:1000ms 单点时限:1000ms 内存限制:256MB Description - 题目描述 As a student of the school of electronics engineering and computer science in Peking University, Kyle took the course named Advanced Algebra in his freshma

ACM: SGU 101 Domino- 欧拉回路-并查集

sgu 101 - Domino Time Limit:250MS     Memory Limit:4096KB     64bit IO Format:%I64d & %I64u Description Dominoes – game played with small, rectangular blocks of wood or other material, each identified by a number of dots, or pips, on its face. The bl

常见HTTP状态码(200、301、302、500等)解说

对网站管理工作者来说有个词不陌生,HTTP状态码,它是用以表示网页服务器HTTP响应状态的3位数字代码.状态码的第一个数字代表了响应的五种状态之一. 1XX系列:指定客户端应相应的某些动作,代表请求已被接受,需要继续处理.由于 HTTP/1.0 协议中没有定义任何 1xx 状态码,所以除非在某些试验条件下,服务器禁止向此类客户端发送 1xx 响应. 2XX系列:代表请求已成功被服务器接收.理解.并接受.这系列中最常见的有200.201状态码. 200状态码:表示请求已成功,请求所希望的响应头或数

SGU 116 Index of super-prime 数论+完全背包+输出方案

题目链接:http://acm.sgu.ru/problem.php?contest=0&problem=116 题意好晦涩 给你一个不超过一万的数 问它最少可以用多少个“超级素数”来表示 使“超级素数”之和等于它 如果无法这样表示 输出0 否则 按非降序形式输出方案 数论部分就模板的问题 没什么说的 完全背包方面也很常规 说说[输出方案] 背包九讲的伪码给的是二维dp[]的方法 实际上稍加改动就可以用在一维数组上 用一个rec[]记录dp[]的当前状态是从哪个状态转移而来(即上一个状态) 通过