首页 > 其他分享 >杂题随笔 2024.10.25 两道图论

杂题随笔 2024.10.25 两道图论

时间:2024-10-25 11:12:03浏览次数:1  
标签:25 2024.10 int -- vector maxn low now 杂题

最近在写abc375这场,最后的F和G是两道很典的图论题。

https://atcoder.jp/contests/abc375/tasks/abc375_f
题意:大致就是说给你一张图,有两种操作:第一种操作是把第i条边删掉,第二种操作是询问u,v两点的最短路。
解法:这种题目印象里好像是考过几次了,把在线询问的顺序转变,倒着做,把减边变成加边操作然后再一步步用Floyd维护最短路即可。这道题的点的数量只有300.具体处理的细节就是先把操作给离线下来,那些没有涉及到操作的边就直接在预处理的时候就更新距离,涉及到操作的边再一步步用Floyd维护。
代码

const ll INF = 1e18;
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int n,m,q;
    cin>>n>>m>>q;
    vector<int> a(m),b(m),c(m);
    for(int i=0;i<m;i++)
    {
        cin>>a[i]>>b[i]>>c[i];
        a[i]--;
        b[i]--;
    }
    vector<int> o(q),x(q),y(q);
    vector<bool> bl(m);
    for(int i=0;i<q;i++)
    {
        cin>>o[i];
        if(o[i]==1)
        {
            cin>>x[i];
            x[i]--;
            bl[x[i]]=1;
        }
        else 
        {
            cin>>x[i]>>y[i];
            x[i]--;
            y[i]--;
        }
    }
    // cerr<<1<<'\n';
    vector dis(n,vector(n,INF));
    for(int i=0;i<n;i++)
    {
        dis[i][i]=0;
    }
    for(int i=0;i<m;i++)
    {
        if(!bl[i])
        {
            dis[a[i]][b[i]]=dis[b[i]][a[i]]=c[i];
        }
    }
    for(int k=0;k<n;k++)
    {
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<n;j++)
            {
                dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
            }
        }
    }
    // cerr<<1<<'\n';
    vector<ll> ans(q);
    for(int i=q-1;i>=0;i--)
    {
        if(o[i]==1)
        {
            int j=x[i];
            for(int x=0;x<n;x++)
            {
                for(int y=0;y<n;y++)
                {
                    dis[x][y]=min({dis[x][y],dis[x][a[j]]+c[j]+dis[b[j]][y],dis[x][b[j]]+c[j]+dis[a[j]][y]});
                }
            }
        }
        else 
        {
            ans[i]=dis[x[i]][y[i]];
        }
    }
    // cerr<<1<<'\n';
    for(int i=0;i<q;i++)
    {
        if(o[i]==2)
        {
            ll x=ans[i];
            if(x==INF)
            {
                cout<<-1<<'\n';
            }
            else 
            {
                cout<<ans[i]<<'\n';
            }
        }
    }
}

https://atcoder.jp/contests/abc375/tasks/abc375_g
题意:给出一张图,问拆掉第i条边会不会改变1到n的最短路。
解法:这种题好像也是常出的题。我们先分别以1和n为起点各自跑一遍Dij,然后去一步步筛选。如果一条边,他到1的最短路+他到n的最短路+他自己的权值=1到n的最短路,那么这条边就先被保存下来,其他不满足这个条件的边就没必要讨论了,全部都是No,因为肯定不会是在1到n的最短路上的。然后我们再考虑这些边,假如说当前遍历到的这条边是桥,那么肯定是Yes,否则是No。
代码:

#define maxn 200010
int n,m;
int a[maxn],b[maxn],c[maxn];
int d1[maxn],d2[maxn];
vector<PII> vec[maxn];
array<int,4> e[maxn];
vector<int> G[maxn];
int vis[maxn];
ll dis[maxn];
priority_queue<PII,vector<PII>,greater<PII> >que;
void dij(int st,int dis[])
{
    for(int i=1;i<=n;i++)
    {
        dis[i]=1e18;
    }
    dis[st]=0;
    que.push({dis[st],st});
    while(!que.empty())
    {
        auto x=que.top().second;
        que.pop();
        if(vis[x]) continue;
        vis[x]=1;
        for(auto [to,val]:vec[x])
        {
            if(dis[to]>dis[x]+val)
            {
                dis[to]=dis[x]+val;
                que.push({dis[to],to});
            }
        }
    }
}
int dfn[maxn],low[maxn],idx;
map<PII,bool> mm;
void dfs(int now,int fa)
{
    dfn[now]=low[now]=++idx;
    for(auto to:G[now])
    {
        if(!dfn[to])
        {
            dfs(to,now);
            low[now]=min(low[now],low[to]);
            if(low[to]>dfn[now])
            {
                mm[{now,to}]=1;
                mm[{to,now}]=1;
            }
        }
        else if(to!=fa)
        {
            low[now]=min(low[now],dfn[to]);
        }
    }
}

vector<array<int,4> > ve;
signed main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    cin>>n>>m;
    for(int i=1;i<=m;i++)
    {
        cin>>a[i]>>b[i]>>c[i];
        e[i]={a[i],b[i],c[i],i};
        vec[a[i]].push_back({b[i],c[i]});
        vec[b[i]].push_back({a[i],c[i]});
    }
    dij(1,d1);
    int dis=d1[n];
    for(int i=1;i<=n;i++)
    {
        vis[i]=0;
    }
    dij(n,d2);
    vector<int> ans(m+1,0);
    for(int i=1;i<=m;i++)
    {
        auto [u,v,w,id]=e[i];
        if(d1[u]+d2[v]+w==dis||d1[v]+d2[u]+w==dis)
        {
            G[u].push_back(v);
            G[v].push_back(u);
            ve.push_back(e[i]);
            // cerr<<1<<'\n';
        }
        else 
        {
            ans[i]=0;
        }
    }
    for(int i=1;i<=n;i++)
    {
        if(!dfn[i])
        {
            dfs(i,0);
        }
    }
    for(auto [u,v,w,id]:ve)
    {
        // cerr<<mm[{u,v}]<<" ";
        if(mm[{u,v}])
        {
            ans[id]=1;
        }
        else 
        {
            ans[id]=0;
        }
    }
    for(int i=1;i<=m;i++)
    {
        if(ans[i])
        {
            cout<<"Yes"<<'\n';
        }
        else 
        {
            cout<<"No"<<'\n';
        }
    }


}

标签:25,2024.10,int,--,vector,maxn,low,now,杂题
From: https://www.cnblogs.com/captainfly/p/18502100

相关文章

  • SI3933低频唤醒无线接收器 超低功耗125K芯片替代AS3933
    Si3933是一款三通道的低功耗ASK接收机,可用于检测15KH2-150KHz低频载波频率的数字信号,并产生唤醒信号。内部集成的校验器用于检测16位或32位曼彻斯特编码的唤醒向量,且支持两次重复的向量校验。Si3933可以使用一个、两个或者三个通道工作,每个通道都具有频率检测功能和数字RSSI计算......
  • 2024.10.23-25 杂题
    2024.10.23-25杂题P7323[WC2021]括号路径如果存在\((a,b,w)\),\((c,b,w)\)。那么\((a,c)\)就是一条合法路径。所以把\(a,c\)放入一个集合。然后合并新的的时候把\(w\)一样的合并了就行。最后统计每个"块"的数量,答案就是\(\sum_{i=1}^{n}C_{cnt_i}^{2}\)复杂度\(O(......
  • 代码随想录算法训练营day25| 491.递增子序列 46.全排列 47.全排列2
    学习资料:https://programmercarl.com/0491.递增子序列.html#算法公开课排列与组合的区别,不用startIndex,而每个树层都从0开始,但是要跳过已经用过的数(用used判断)学习记录:491.递增子序列(添加一个数组used(hash表),来保持数组每个位置上的数的使用情况,没用过为0,用过变成1)点击查看代......
  • SketchUp:材质与纹理应用教程_2024-07-16_07-25-53.Tex
    SketchUp:材质与纹理应用教程SketchUp基础介绍SketchUp软件概述SketchUp,由Trimble公司开发,是一款广泛应用于建筑、室内设计、景观设计等领域的3D建模软件。它以其直观的用户界面和强大的建模功能而闻名,适合从初学者到专业人士的广泛用户群体。SketchUp分为两个版本:Ske......
  • 20222403 2024-2025-1 《网络与系统攻防技术》实验三实验报告
    1.实验内容1.1.实践内容(1)正确使用msf编码器,veil-evasion,自己利用shellcode编程等免杀工具或技巧正确使用msf编码器,使用msfvenom生成如jar之类的其他文件veil,加壳工具使用C+shellcode编程(2)通过组合应用各种技术实现恶意代码免杀如果成功实现了免杀的,简单语言描述原......
  • 2024.10.23 李赛
    A.CloseGroup直接状压。B.P1054[NOIP2005提高组]等价表达式傻逼吗???????怎么又不匹配的括号题面里还不说的?????建括号树,然后随一万个数判定即可。C.P7217[JOISC2020]収穫赛时感觉不可做就没做,看来我直觉还是挺准的,但是策队秒了。最重要的一步是观察到每个人摘了苹果之后下一个......
  • ChatGPT-4国内中文版镜像网站整理合集(2024/10/25)
    一、GPT中文版镜像网站①lanjing.ai支持GPT4、4o以及o1,支持MJ绘画②LearnItForSelf支持通用全模型,支持文件读取、插件、绘画、AIPPT③AIChat支持GPT3.5/4,4o以及MJ绘画1.什么是镜像站镜像站(MirrorSite)是指通过复制原始网站内容和结构,创建的备用网站。其主要目的是在......
  • HONEYWELL霍尼韦尔QCS系统5425400详解
    HONEYWELL霍尼韦尔QCS系统5425400是霍尼韦尔公司提供的一款高质量控制系统,该系统被广泛应用于多个工业领域,以下是关于该系统的详细介绍:一、系统概述HONEYWELL霍尼韦尔QCS系统5425400作为质量控制及系统的重要组成部分,具有高精度、高稳定性和易操作等特点。该系统采用先进的测......
  • 团队练习记录2024.10.23
    比赛链接:https://codeforces.com/gym/104976D.OperatorPrecedence队友解的,想办法让第二个式子中括号内数值为1,所以就2,-1交替,最后一个选1可逆推,第一个为2*n-3#include<iostream>#include<queue>#include<map>#include<set>#include<vector>#include<algorithm>#inc......
  • 20222305 2024-2025-1 《网络与系统攻防技术》实验三实验报告
    网络攻防实验报告姓名:田青学号:20222305实验日期:2024/10/18—2024/10/31实验名称:后门原理与实践指导教师:王志强1.实验内容本周学习内容总结:1.用户态(ring3)和内核态(ring0),切换时机:系统调用、中断、异常。2.自启动技术。3.进程隐藏技术实现:1>改名2>基于系统服务的伪装3>......