CF1385E Bordes de dirección

Teorema aleatorio 1: Dado un gráfico no dirigido, marque la dirección en el lado opuesto, debe haber una forma de hacer que el gráfico sea acíclico.
En ese momento, la idea era ordenar topológicamente los bordes dirigidos. Según el Teorema 1, pone ("NO") si hay un anillo en este momento, de lo contrario, de acuerdo con el orden topológico obtenido de la clasificación topológica anterior, desde el borde pequeño hasta el borde daliano. Porque sabemos que todos los DAG están conectados desde puntos con un orden topológico pequeño a puntos con un orden topológico grande.
Según el tamaño del orden topológico, el marcado de la dirección del gráfico no dirigido parece haberse hecho una vez antes. Espero poder pensar en este método para preguntas similares la próxima vez.
#include <bits/stdc++.h>
using namespace std;
const int N=2e5+5; 
int T,n,m,opt[N],u[N],v[N];
int du[N],dep[N];
bool vis[N];
int cnt,head[N];
struct edge{
    
    int next,to;}e[N];

inline void add(int u,int v)
{
    
    
	cnt++;
	e[cnt].next=head[u];
	e[cnt].to=v;
	head[u]=cnt;
}

queue<int>q;
int main(){
    
    
	scanf("%d",&T);
	while (T--)
	{
    
    
		scanf("%d%d",&n,&m);
		cnt=0;
		for (register int i=1; i<=n; ++i) head[i]=0;
		for (register int i=1; i<=n; ++i) vis[i]=false;
		for (register int i=1; i<=n; ++i) du[i]=0; 
		for (register int i=1; i<=m; ++i)
		{
    
    
			scanf("%d%d%d",&opt[i],&u[i],&v[i]);
			if (opt[i]) add(u[i],v[i]),du[v[i]]++;
		}
		for (register int i=1; i<=n; ++i) if (!du[i]) q.push(i),vis[i]=true;
		int tot=0;
		while (q.size())
		{
    
    
			int u=q.front(); q.pop();
			dep[u]=++tot;
			for (register int i=head[u]; i; i=e[i].next)
			{
    
    
				du[e[i].to]--;
				if (!du[e[i].to]) q.push(e[i].to),vis[e[i].to]=true;
			}
		}
		bool jay=true;
		for (register int i=1; i<=n; ++i) if (du[i]) {
    
    jay=false; break;}
		if (!jay) {
    
    puts("NO"); continue;}
		puts("YES");
		for (register int i=1; i<=m; ++i)
		{
    
    	
			if (!opt[i])
			{
    
    
				if (dep[u[i]]<dep[v[i]]) printf("%d %d\n",u[i],v[i]);
				else printf("%d %d\n",v[i],u[i]);
			}
			else
			{
    
    
				printf("%d %d\n",u[i],v[i]);	
			}
		}
	}
return 0;
}

Supongo que te gusta

Origin blog.csdn.net/Dove_xyh/article/details/108460081
Recomendado
Clasificación