首页 > 其他分享 >1385E. Directing Edges(拓扑序的应用)

1385E. Directing Edges(拓扑序的应用)

时间:2024-05-01 20:56:54浏览次数:28  
标签:有向图 指向 int 拓扑 Directing Edges 有环 1385E topos

背景:本题为构造DAG题,给出了有向与无向边,CF2000分题目

   思路:先处理有向图,判断是否有环,有就NO,否则一定有解.

   我们思考一下有环的条件(或者说环在什么情况下产生):即后面的数指向前面的数才可能构成环,即拓扑序大的指回去了!

   故得构造思路:即让无向边的拓扑序小的指向大的即不会产生环

   细节:想想全为无向边的情况下处理

代码如下:

点击查看代码
//背景:本题为构造DAG题,给出了有向与无向边,CF2000分题目
/*思路:先处理有向图,判断是否有环,有就NO,否则一定有解.
       我们思考一下有环的条件(或者说环在什么情况下产生):即后面的数指向前面的数才可能构成环,即拓扑序大的指回去了!
       故得构造思路:即让无向边的拓扑序小的指向大的即不会产生环*/
//细节:想想全为无向边的情况下处理
#include <bits/stdc++.h>
using namespace std;
void Solve()
{
    int n,m,t,x,y;
    cin>>n>>m;
    vector<int> e1[n+1];//邻接表存有向图
    vector<pair<int,int>>e2;//存无向边
    int topos[n+1];//记录拓扑序
    int in[n+1];//记录入度
    memset(topos,0,sizeof(topos));//初始拓扑序为0
    memset(in,0,sizeof(in));//初始化入度为0
    for (int i = 1;i<=m;i++)//输入边
    {
        cin>>t>>x>>y;
        if(t == 0)
        {
            e2.push_back({x,y});//无向
        }
        else
        {
            in[y]++;
            e1[x].push_back(y);//有向
        }
    }
    queue<int> que;//拓扑队列
    for (int i = 1;i<=n;i++)//这里跟以前的不太一样!!!采用了遍历而非拓扑图中存在的点,即也处理不在拓扑图中的点,其入度必为0
    {
        if(in[i] == 0) que.push(i);
    }
    int ans = 0;//初始化计数
    while(!que.empty())//拓扑排序(显然优先处理入度为0的,所以不在拓扑图中的点也会被计算且被赋予拓扑序,神来之笔),而不在拓扑图中的点的拓扑序必然小!!
    {
        x = que.front();
        que.pop();
        ans++;
        topos[x] = ans;//记录当前点的拓扑序
        for (auto v:e1[x])
        {
            in[v]--;
            if(in[v] == 0) que.push(v);
        }
    }
    if(ans < n)//以n为判断环的标准了!!!
    {
        cout<<"NO"<<"\n";
        return;
    }
    cout<<"YES"<<"\n";
    for (int i = 1;i<=n;i++)//先输出有向边
    {
        for (auto v:e1[i]) cout<<i<<" "<<v<<"\n";
    }
    for (auto v:e2)//处理无向边,由小向大输出
    {
        if(topos[v.first] < topos[v.second]) cout<<v.first<<" "<<v.second<<"\n";
        else cout<<v.second<<" "<<v.first<<"\n";
    }
}
int main()
{
    ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    int t;
    cin>>t;
    while(t--)
    {
        Solve();
    }
    return 0;
}


/*我的Hack数据:
  1
  4 4
  0 1 2
  0 2 3
  0 3 4
  0 4 1
*/
多多支持!!!

标签:有向图,指向,int,拓扑,Directing,Edges,有环,1385E,topos
From: https://www.cnblogs.com/cuijunjie18/p/18169626

相关文章

  • [ABC259F] Select Edges 题解
    很容易想到树形dp。考虑在有根树内,每个点都有两种状态:不选自己和父亲的边;要选自己和父亲的边。那么单独对于子树内部而言,就要分两种情况:最多可以向\(d_i\)个孩子连边,对应上述第一种情况,我们称之为\(f_i\);最多可以向\(d_i-1\)个孩子连边,对应上述第二种情况,我们称之......
  • 关于scrapy框架爬某站出现DEBUG: Redirecting (meta refresh)的问题
    项目场景:Spider框架爬取m.baidu.com搜索结果问题描述访问地址为https://m.baidu.com/s?word=电影&pn=0最后结果变成了http://m.baidu.com/s?cip6=240e:390:6a52:67e5:b0fa:e9d6:226e:376d&word=电影&pn=0&pu=sz%401321_480&t_noscript=jump导致结果不对importjson......
  • EdgeSAM: Prompt-In-the-Loop Distillation for On-Device Deployment of SAM
    EdgeSAM:Prompt-In-the-LoopDistillationforOn-DeviceDeploymentofSAMEdgeSAM论文:https://arxiv.org/pdf/2312.06660.pdfEdgeSAM代码:https://github.com/chongzhou96/EdgeSAM1概述作者在对各种蒸馏策略进行深入剖析后,证实了task-agnostic的编码器蒸馏难以完全吸......
  • Coloring Edges
    \(Solution\)link一个经典结论是有向图中的任意一个环总能由一条生成树上的从祖先到儿子的链以及一条返祖边组成,正确性显然。不妨将所有树边和横插边都染成黑色,返祖边染成白色,这样就可以保证任意一个环都有两种颜色了。判断横插边和返祖边可以用栈来维护。#include<bits/std......
  • 2024-02-24:用go语言,给你一个 n 个点的带权无向连通图,节点编号为 0 到 n-1, 同时还有一
    2024-02-24:用go语言,给你一个n个点的带权无向连通图,节点编号为0到n-1,同时还有一个数组edges,其中edges[i]=[fromi,toi,weighti],表示在fromi和toi节点之间有一条带权无向边,最小生成树(MST)是给定图中边的一个子集,它连接了所有节点且没有环,而且这些边的权值和最......
  • EdgeSAM革新:iPhone上的实时SAM,速度提升40倍!
    引言近日,洋理工大学与上海AILab合作研发的EdgeSAM在移动端图像分割领域取得了重大突破。这一优化版SegmentAnythingModel(SAM)变体在iPhone14上的运行速度达到了惊人的38FPS,相比原始SAM快了40倍,为移动设备上的实时交互式图像分割开辟了新天地。Github:https://github.com/chongz......
  • [AGC052B] Tree Edges XOR 题解
    题目链接点击打开链接题目解法怎么感觉这场\(B\)比\(C\)思维量更大考虑一步很妙的操作:把边权变成点权,以达到简化操作的目的使每条边的边权为两端点的异或和,手画一下可以发现,操作简化成了交换两端点的点权我们定义\(d_{1/2,i}\)定义为在\(1/2\)树上,\(i\)到根的权值......
  • [CF576E] Painting Edges
    PaintingEdges动态加边和二分图容易想线段树分治,分别维护k种颜色的并查集。不过每条边的存在时间不能确定。设边i的两次操作的时间为\(x_i,y_i\),那么对于\(t\in[x_i+1,y_i-1]\)有两种情况,颜色改变或改色不变。则我们把每次操作影响的时间放在树上,从左到右递归到叶......
  • 2023-10-04:用go语言,现有一棵无向、无根的树,树中有 n 个节点,按从 0 到 n - 1 编号 给你
    2023-10-04:用go语言,现有一棵无向、无根的树,树中有n个节点,按从0到n-1编号给你一个整数n和一个长度为n-1的二维整数数组edges,其中edges[i]=[ai,bi]表示树中节点ai和bi之间存在一条边。每个节点都关联一个价格。给你一个整数数组price,其中price[i]是第i......
  • 2023-10-04:用go语言,现有一棵无向、无根的树,树中有 n 个节点,按从 0 到 n - 1 编号 给你
    2023-10-04:用go语言,现有一棵无向、无根的树,树中有n个节点,按从0到n-1编号给你一个整数n和一个长度为n-1的二维整数数组edges,其中edges[i]=[ai,bi]表示树中节点ai和bi之间存在一条边。每个节点都关联一个价格。给你一个整数数组price,其中price[i]是第i......