首页 > 其他分享 >ARC143D Bridges

ARC143D Bridges

时间:2024-01-28 23:11:37浏览次数:27  
标签:ARC143D head num Bridges int tot edge maxn

ARC143D Bridges

巧妙的图论题。

思路

分析题目,发现很像拆点。

由于拆点要设置出入点,这里我们也把 \(a_i\) 设成入点,把 \(a_i+n\) 设成出点,再次分析问题。

考虑我们把拆的点合并成一个点,对于 \((a_i,b_i)\) 建边,建出图 \(G\)。

不难发现,原图是图 \(G\) 展开后的形态,且只有按照出入点的方式构造图 \(G\) 才是最优解,可以考虑把此图还原原图。

我们只需要找一个点开始一个点一个点的把图 \(G\) 遍历出了就 OK(记得删边,边不可以走两次)。

CODE

#include<bits/stdc++.h>
using namespace std;

const int maxn=4e5+5;

struct Edge
{
    int tot;
    int head[maxn];
    struct edgenode{int to,nxt,num;}edge[maxn*2];
    void add(int u,int v,int z)
    {
        tot++;
        edge[tot].to=v;
        edge[tot].nxt=head[u];
        edge[tot].num=z;
        head[u]=tot;
    }
}G;

int n,m;
int a[maxn],b[maxn],ans[maxn];

bool vis[maxn],cis[maxn];

void dfs(int u)
{
    vis[u]=1;
    for(int i=G.head[u];i;i=G.edge[i].nxt)
    {
        int v=G.edge[i].to;
        if(cis[G.edge[i].num]) continue;
        cis[G.edge[i].num]=1;
        ans[G.edge[i].num]=(a[G.edge[i].num]==u);
        if(vis[v]) continue;
        dfs(v);
    }
}

int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=m;i++) scanf("%d",&a[i]);
    for(int i=1;i<=m;i++) scanf("%d",&b[i]);
    for(int i=1;i<=m;i++) G.add(a[i],b[i],i),G.add(b[i],a[i],i);
    for(int i=1;i<=n;i++)
        if(!vis[i]) dfs(i);
    for(int i=1;i<=m;i++) printf("%d",ans[i]);
}

标签:ARC143D,head,num,Bridges,int,tot,edge,maxn
From: https://www.cnblogs.com/binbinbjl/p/17993598

相关文章

  • poj 2288 Islands and Bridges
    IslandsandBridgesTimeLimit:4000MS MemoryLimit:65536KTotalSubmissions:15357 Accepted:4098DescriptionGivenamapofislandsandbridgesthatconnecttheseislands,aHamiltonpath,asweallknow,isapathalongthebridgessuch......
  • CF908H New Year and Boolean Bridges
    这说明你那破子集卷积不是万能的。显然题目要求的图\(G'\)是弱联通的,考虑给出的图\(G\)中两个点\(i,j\)之间\(G_{i,j}\)的条件转化为:\(G_{i,j}=\mathttA\),说明\(i\)能到\(j\)且\(j\)能到\(i\),则\(i,j\)在\(G'\)的同一个强连通分量中。\(G_{i,j}=\mathttO......
  • HDU4738 Caocao's Bridges
    \(HDU4738\)\(Caocao\)'\(s\)\(Bridges\)一、题目描述曹操在长江上建立了一些点,点之间有一些边连着。如果这些点构成的无向图变成了连通图,那么曹操就无敌了。刘备为了防止曹操变得无敌,就打算去摧毁连接曹操的点的桥。但是诸葛亮把所有炸弹都带走了,只留下一枚给刘备。所以刘......
  • CEOI2017 Building Bridges
    小清新斜率优化题。分段问题显然dp,令\(f_i\)为将第\(1\)根柱子和第\(i\)根柱子连接的最小代价。\(f_1=0\),每次枚举\(i\)向前直接连接的柱子:\[f_{i}=\min\limits_{j=1}^{i-1}\left\{f_j+(h_i-h_j)^2+\sum\limits_{k=j+1}^{i-1}w_k\right\}\]令\(s_{i}=\sum\limits_{j=......
  • Building Bridges 题解
    BuildingBridges题目大意连接两根柱子\(i,j\)的代价是\((h_i-h_j)^2+\sum\limits_{k=j+1}^{i-1}w_k\),连接具有传递性,求将\(1,n\)连接的最小代价。思路分析斜率优化DP板题。设\(f_i\)表示考虑到前\(i\)根柱子并强制选择第\(i\)根柱子的最小代价,所求即\(f_n\)。......
  • Codeforces 908H - New Year and Boolean Bridges(FWT)
    一道挺有意思的题,并且感觉有点诈骗的成分在内(首先考虑分析三种字符的性质:显然任意两点\(i,j\)之间要么\(i\)可以到达\(j\),要么\(j\)可以到达\(i\),否则AOX三个一个都不能满足。如果两点间的状态是A,那么这两点必须在同一强连通分量内。如果两点间的状态是X,那么这......
  • 【APIO2015】Palembang Bridges
    容易想到先排除不用过桥的再把过桥的1加上,剩下只需要考虑河边走的距离。首先考虑k=1的情况,容易发现相当于是一个直线上2n个点选一个点到所有点距离和最小,经典的结论选在中......