首页 > 其他分享 >topsort应用

topsort应用

时间:2023-03-08 13:22:17浏览次数:33  
标签:PII topsort int 环图 应用 方向 include 105

题目:
给定一个由 n 个点和 m 条边构成的图。

不保证给定的图是连通的。

图中的一部分边的方向已经确定,你不能改变它们的方向。

剩下的边还未确定方向,你需要为每一条还未确定方向的边指定方向。

你需要保证在确定所有边的方向后,生成的图是一个有向无环图(即所有边都是有向的且没有有向环的图)。

输入格式
第一行包含整数 T,表示共有 T 组测试数据。

每组数据第一行包含两个整数 n,m。

接下来 m 行,每行包含三个整数 t,x,y,用来描述一条边的信息,其中 t 表示边的状态,如果 t=0,则表示边是无向边,如果 t=1,则表示边是有向边。x,y 表示这条边连接的两个端点,如果是有向边则边的方向是从 x 指向 y。

保证图中没有重边(给定了 (x,y),就不会再次出现 (x,y) 或出现 (y,x))和自环(不会出现 x=y 的情况)。

输出格式
对于每组数据,如果无法构造出有向无环图,则输出一行 NO。

否则,先输出一行 YES,随后 m 行,每行包含两个整数 x,y,用来描述最终构造成的有向无环图中的每条边的具体方向(x 指向 y),边的先后顺序随意。

注意,已经确定方向的边,不能更改方向。

如果答案不唯一,输出任意合理方案均可。

数据范围
对于前三个测试点,1≤n,m≤10。
对于全部测试点,1≤T≤20000,2≤n≤2×105,1≤m≤min(2×105,n(n−1)2),0≤t≤1,1≤x,y≤n。
保证在一个测试点中,所有 n 的和不超过 2×105,所有 m 的和不超过 2×105。

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
using namespace std;
typedef pair<int,int> PII;
const int N = 2e5+10, M = 2*N;
int e[M],ne[M],h[N],idx;
PII p1[M];
PII p2[M];
int d[N];
int cnt1,cnt2;
int n,m; 
int q[N];
int pos[N];
int cnt[N];
/*
性质:
如果有向边已经成环了 就无解
如果有向边是拓扑的,那么就一定有解
*/

bool topsort()
{
    int tt = -1,hh=0;
    for(int i = 1;i<=n;i++)
    if(!d[i]) q[++tt] = i;
    
        while(hh<=tt)
        {
            int t =q[hh++];
            for(int i = h[t];~i;i=ne[i])
            {
                int j =e[i];
                d[j]--;
                if(!d[j]) q[++tt] = j;
            }
        }
       return tt==n-1;
}
void add(int a,int b)
{
    e[idx] = b,ne[idx] = h[a],h[a] = idx++;
}
int main()
{
     int T;
     scanf("%d",&T);
     while(T--)
     {
         memset(d,0,sizeof d);
         memset(h,-1,sizeof h);
         idx = cnt2 = cnt1 = 0;
         scanf("%d%d",&n,&m);
         for(int i = 0;i<m;i++)
         {
             int  t,x,y;
             scanf("%d%d%d",&t,&x,&y);
             if(t==0) 
                 p2[cnt2++]= {x,y};
             else
             {
                 add(x,y);
                 p1[cnt1++] = {x,y};
                 d[y]++;
             }
         }
         if(topsort())
         {
             puts("YES");
            for(int i = 1;i<=n;i++)
            for(int j = h[i];~j;j=ne[j])
            {
                printf("%d %d\n",i,e[j]);
            }
            for(int i = 0;i<n;i++) pos[q[i]]  = i;
            
            for(int i = 0;i<cnt2;i++)
            {
                int a = p2[i].first,b = p2[i].second;
                if(pos[a]>pos[b]) swap(a,b);
                printf("%d %d\n",a,b);
            }
         }
         else
         {
             puts("NO");
         }
     }
    return 0;
}

标签:PII,topsort,int,环图,应用,方向,include,105
From: https://www.cnblogs.com/freshman666/p/17191705.html

相关文章

  • Java分布式应用:性能调优
    第五部分性能调优性能瓶颈的表象:1.资源消耗过多、外部处理系统的性能不足2.资源消耗不多,但程序的响应速度不够关于CPU通常使用时间片、多核的方法达到对CPU的分割;每个C......
  • Java分布式应用:分布式Java应用与Sun JDK类库
    第四部分分布式Java应用与SunJDK类库集合包CollectionList接口:List接口:List(有序、可重复)的实现类有ArrayList、Vector、LinkListArrayList、Vector底层是通过数组实现......
  • Java分布式应用:深入了解JVM
    第三部分深入理解JVMJava代码的执行过程Java源码编译机制javac将java源码转换成javaclass字节码java运行javaclass字节码Java编译后产生的是字节码,在运行的时候将字......
  • 北京君正X系列:高清无损音乐播放器应用案例
    优秀的播放器除了能够让用户畅享高品质音乐带给双耳无限的乐趣之外,还要让视觉与听觉同时达到巅峰享受。M1s106g的轻盈体重搭配掌心专属的72*69*16mm尺寸,让播放器实现高度便......
  • 迅为3A5000_7A2000开发板龙芯全国产处理器LoongArch架构核心主板应用到很多
    iTOP-3A5000开发板采用全国产龙芯3A5000处理器,基于龙芯自主指令系统(LoongArch)的LA464微结构,并进一步提升频率,降低功耗,优化性能。在与龙芯3A4000处理器保持引脚兼容的基础......
  • Azure虚拟桌面专题之九:管理应用组
    为Azure虚拟桌面主机池创建的默认应用组也会发布完整桌面。此外,我们还可以通过Azure门户管理应用组,为主机池创建一个或多个RemoteApp应用程序组。本文将介绍如何创建R......
  • 2022虚拟人应用与实践报告
    导读:原文《2022虚拟人应用与实践报告》,本文精选其中精华及架构部分,逻辑清晰、内容完整,为快速形成售前方案提供参考          ......
  • OpenYurt 在龙源 CNStack 云边协同项目的应用
    作者:龙源电力:张悦超、党旗  阿里云原生:李志信OpenYurt介绍OpenYurt是业界首个对云原生体系无侵入的智能边缘计算平台,具备全方位的“云、边、端一体化”能力,能......
  • 什么是密评?哪些信息系统需要做密码应用安全性评估?
    随着信息技术的飞速发展,网络安全形势愈发严峻,各种安全威胁来势汹汹,勒索软件、数据泄露等各种安全事件层出不穷。我国面临的网络安全问题同样严峻。而商用密码是保障网络空间......
  • VUE+.NET应用系统的国际化-整体设计思路
    近期产品要支持国际化多语言,主要涉及前端界面国际化以及后端提示信息、异常信息的国际化多语言支持。目前我们的开发技术栈:前端VUE、后端.NET。面向前端界面和后端服务,分......