[黑科技]分层图

最近几天写了一些分层图的题目,来总结一下

分层图有一个很重要的性质:上一层不能到达下一层,但下一层能到达上一层

分层图常常结合最短路,所以叫分层图最短路,当然,也结合缩点之类的

[USACO09FEB]改造路Revamping Trails

双倍经验题[JLOI2011]飞行路线

这是一道分层图最短路裸题

考虑\(dp\),\(dis[i][j]\)表示到达第\(i\)个点已经\(j\)次升级后所经过的最短路径

那么就可以愉快的在\(Dijkstra\)里分类讨论一下

\(Code\ Below:\)

#include <bits/stdc++.h>
#define mp make_pair
#define S second
#define F first
using namespace std;
const int maxn=10000+10;
const int maxm=50000+10;
int n,m,k,head[maxn],dis[maxn][21],vis[maxn][21],tot;
struct node{
    int to,next,val;
}e[maxm<<1];

inline int read(){
    register int x=0,f=1;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
    return (f==1)?x:-x;
}
inline void add(int x,int y,int w){
    e[++tot].to=y;
    e[tot].val=w;
    e[tot].next=head[x];
    head[x]=tot;
}
void Dijkstra(){
    memset(dis,0x3f3f3f3f,sizeof(dis));
    priority_queue<pair<int,pair<int,int> > > pq;
    pair<int,int> u;int v;
    dis[1][0]=0;pq.push(mp(0,mp(1,0)));
    while(!pq.empty()){
        u=pq.top().S;pq.pop();
        if(vis[u.F][u.S]) continue;
        vis[u.F][u.S]=1;
        for(int i=head[u.F];i;i=e[i].next){
            v=e[i].to;
            if(dis[v][u.S]>dis[u.F][u.S]+e[i].val){
                dis[v][u.S]=dis[u.F][u.S]+e[i].val;
                pq.push(mp(-dis[v][u.S],mp(v,u.S)));
            }
            if(u.S+1<=k&&dis[v][u.S+1]>dis[u.F][u.S]){
                dis[v][u.S+1]=dis[u.F][u.S];
                pq.push(mp(-dis[v][u.S+1],mp(v,u.S+1)));
            }
        }
    }
}

int main()
{
    n=read(),m=read(),k=read();
    int x,y,w;
    for(int i=1;i<=m;i++){
        x=read(),y=read(),w=read();
        add(x,y,w);add(y,x,w);
    }
    Dijkstra();
    printf("%d\n",dis[n][k]);
    return 0;
}

[USACO15JAN]草鉴定Grass Cownoisseur

这道题比刚刚那道麻烦一点

首先看到有环,缩点一下,重新建图。把图复制一遍,将第一层的\(to[i]\)向第二层的\(x\)连一条边

\(Code\ Below:\)

#include <bits/stdc++.h>
#include <time.h>
#define inf 99999999
using namespace std;
const int maxn=100000+10;
int n,m,low[maxn],dfn[maxn],vis[maxn<<1],tim;
int head[maxn<<1],to[maxn<<2],nxt[maxn<<2],tot;
int col[maxn],siz[maxn<<1],color;
int x[maxn],y[maxn],dis[maxn<<1];
stack<int> s;
inline int read(){
    register int x=0,f=1;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
    return (f==1)?x:-x;
}
inline void add(int x,int y){
    to[++tot]=y;
    nxt[tot]=head[x];
    head[x]=tot;
}
void tarjan(int u)
{
    low[u]=dfn[u]=++tim;
    vis[u]=1;s.push(u);
    for(int i=head[u];i;i=nxt[i]){
        int v=to[i];
        if(!dfn[v]){
            tarjan(v);
            low[u]=min(low[u],low[v]);
        }
        else if(vis[v]) low[u]=min(low[u],dfn[v]);
    }
    if(low[u]==dfn[u]){
        color++;
        while(s.top()!=u){
            vis[s.top()]=0;
            col[s.top()]=color;
            siz[color]++;
            s.pop();
        }
        vis[u]=0;col[u]=color;siz[color]++;s.pop();
    }
}

int main()
{
    n=read(),m=read();
    for(int i=1;i<=m;i++){
        x[i]=read(),y[i]=read();
        add(x[i],y[i]);
    }
    for(int i=1;i<=n;i++)
        if(!dfn[i]) tarjan(i);
    memset(head,0,sizeof(head));
    memset(to,0,sizeof(to));
    memset(nxt,0,sizeof(nxt));
    memset(vis,0,sizeof(vis));
    tot=0;
    for(int i=1;i<=m;i++)
        if(col[x[i]]!=col[y[i]]){
            add(col[x[i]],col[y[i]]);
            add(col[x[i]]+color,col[y[i]]+color);
            add(col[y[i]],col[x[i]]+color);
        }
    for(int i=1;i<=color;i++) siz[i+color]=siz[i];
    queue<int> q;
    vis[col[1]]=1;
    q.push(col[1]);
    while(!q.empty()){
        int u=q.front();q.pop();vis[u]=0;
        for(int i=head[u];i;i=nxt[i]){
            int v=to[i];
            if(dis[v]<dis[u]+siz[u]){
                dis[v]=dis[u]+siz[u];
                if(!vis[v]){
                    vis[v]=1;
                    q.push(v);
                }
            }
        }
    }
    printf("%d\n",dis[col[1]+color]);
    return 0;
}

原文地址:https://www.cnblogs.com/owencodeisking/p/9610084.html

时间: 2024-11-13 06:08:37

[黑科技]分层图的相关文章

【转】这些JavaScript编程黑科技,装逼指南,高逼格代码,让你惊叹不已

[转]这些JavaScript编程黑科技,装逼指南,高逼格代码,让你惊叹不已 Javascript是一门很吊的语言,我可能学了假的JavaScript,哈哈,大家还有什么推荐的 本文秉承着:你看不懂是你SB,我写的代码就要牛逼. 1.单行写一个评级组件 "★★★★★☆☆☆☆☆".slice(5 - rate, 10 - rate);定义一个变量rate是1到5的值,然后执行上面代码,看图 才发现插件什么的都弱爆了 2.如何装逼用代码骂别人SB (!(~+[])+{})[--[~+&qu

书乐说:跑错了轨道,“黑科技”再多也是枉然

如果创新一开始就"跑"错了轨道,"黑科技"再多也是枉然.对于时下许多以"黑科技"为卖点的创新公司来说,Vectrex游戏机就是一个绝佳的范例. 文/张书乐 原载于<人民邮电报>2016年7月8日<乐游记>专栏110期 史密斯工程公司之所以选择用矢量图技术作为家用游戏主机的游戏基础表现形式,其实有自己的考虑.他们最初的设想是研发一款迷你街机,或者说是一款类似于掌上游戏机的设备,只是需要连接一台显示器.或者我们可以理解为一台一

竖亥——京东以神为名出击,神一样的物流黑科技

曾经,一谈起快递.物流,第一反应就是劳动密集型行业,跟信息化.高科技几乎没有任何关系,更不会与代表科技前沿与未来想象的黑科技出现交集.但继亚马逊对黑科技没有门也要爬窗进的执着追求后,京东也开始研究.应用黑科技了.竖亥项目是京东联合英特尔,利用英特尔RealSense技术和京东强大的软件开发能力,全新推出的应用于仓储商品物流属性的自动采集项目. 自动采集取代人工操作 首先看下竖亥小车如何取代人工操作: 如图所示,这个自动采集必备的竖亥小车由车体.深度传感器.电脑或者平板的显示屏.玻璃底板以及附加的

【转载】史上最全:TensorFlow 好玩的技术、应用和你不知道的黑科技

[导读]TensorFlow 在 2015 年年底一出现就受到了极大的关注,经过一年多的发展,已经成为了在机器学习.深度学习项目中最受欢迎的框架之一.自发布以来,TensorFlow 不断在完善并增加新功能,直到在这次大会上发布了稳定版本的 TensorFlow V1.0.这次是谷歌第一次举办的TensorFlow开发者和爱好者大会,我们从主题演讲.有趣应用.技术生态.移动端和嵌入式应用多方面总结这次大会上的Submit,希望能对TensorFlow开发者有所帮助. TensorFlow:面向大

【2016.12.08】CSS中的一些黑科技2

1.border-radius 基本上很多人都是这么用的: .div { border-radius: 4px; } 稍微高端一点 .div { border-radius: 4px 6px 6px 4px; } 终极黑科技是这样用的 .div { border-radius: 10px 10px 30px 2px / 50px 50px 10px 3px; } 效果如图: border-radius 它可以赋8个值:斜线前面的影响的是水平方向,斜线后面影响的是垂直方向,各个数字就分别代表四个不

书乐说:装满了黑科技的“光速船”游戏机,果然率先沉了

创新的"小船"怎能说翻就翻?或许"黑科技"太多了,导致"消化"不良. 文/张书乐 原载于<人民邮电报>2016年7月8日<乐游记>专栏108期 上期专栏中谈到的Vectrex游戏主机,堪称"黑科技"综合体,而3D眼镜并非它的核心优势,因为其科技含量已经相当高.比如,与3D眼镜同样是外设的光笔就很有卖点,它类似于后来出现的游戏外设光枪.但是光笔可一点也不"暴力",它是一支可以在电视屏幕

黑科技之三元环讲解

三元环是一个不怎么常见的黑科技,它的求解方法是一种基于分块思想的方法,比较简单好写,在这里介绍一下三元环的计数方法及正确性与时间复杂度证明. 对于一个n个点m条边的无向图,三元环是指对于图上的三个点,两两点之间都直接有边相连,这三个点组成的环就是三元环. 三元环的计数方法:记录图中每个点的度数,对于每条边将它定向.对于一条边,将度数大的点指向度数小的点,如果度数相同就将编号小的点指向编号大的点.计数时枚举每个点,对于每个点x枚举它的出边,并将出边指向的点y打标记,对于所有出边指向的点y再枚举出边

4大特点解析华为云数据湖“黑科技”

4大特点解析华为云数据湖"黑科技"如果有人问数据湖是什么,我会告诉他们,是"桶装水"的集合.随着企业业务的发展,数据出现井喷,数据量呈几何增长,数据来源和类型更加多元化.传统数据仓库就如同"桶装水商店",已经承载不了全部水体,因此需要一个可以满足存储需求的,新的架构作为大数据的支撑.这就是数据湖.它汇聚不同数据源的溪流,包括大量无序的非结构化数据(文本.图像.声音.网页等).我们把它倒入数据湖,然后开始探索该数据.我们希望这是一个包含所有数据的,

百度再出Lens黑科技!用Paddle Mobile实现类人眼视觉AI能力

你知道吗?人类有 70%的信息获取来自于视觉.但目前存在两个问题: ①人眼本身只能看到物理世界,无法看到其背后复杂的信息世界: ②人类的记忆力有限,视野有限,于是会出现看了就忘.视野窄等各种问题. 科幻片里常见这样一种"人肉外挂":通过一系列的技术改造,主人公(比如史塔克)眼前出现的一切物体都会被自动识别,什么名称.用途.用法用量,全都可以秒速反馈回来,并被即时载入到记忆中,过目不忘. 如今,百度识图在百度 App 和简单搜索 App 上推出的最新版,通过应用Lens技术把这种科幻场景