欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

2018 .5.5 T1混合图

程序员文章站 2024-03-13 23:30:58
...

混合图

文件名dizzy.c/cpp/pas 时间限制1s 内存限制128M

题目描述

YZM有一张N个点,M1条有向边,M2条无向边组成的混合图。询问一个给所有无向边定向的方案。使得最终的图中没有环。保证一定有解。

输入格式(输入文件dizzy.in

第一行,三个数字N,M1,M2

接下来M1+M2行,每行两数字Ai,Bi。表示一条边。

M1条是有向边。方向是AiBi

输出格式(输出文件dizzy.out

输出M2行,按输出顺序输出为无向边确定的方向。Ai BiBiAi

无解只输出-1”。

样例数据

Input

4 2 3

1 2

4 3

1 3

4 2

3 2

Output

1 3

2 4

2 3

数据规模

1<=N<=100 000

1<=M1,M2<=100 000

----------------------------------------------------------------------------

如果本身是有向图是一个环,直接输出-1。

以为如果有环,即出现了反向的道路,这时想到了拓扑序,对于无向边,将其从拓扑序小的连到大的。显然不会出现环

#include <cstdio>
#include <queue>
#include <cstring>
#include <algorithm>
using namespace std;
const int N=1e5+7;
int head[N],tp[N],dee[N],ru[N];
int n,m1,m2,cnt,num;
struct edge {
	int t,next;
}e[N];
void add(int u,int t) {
	e[++cnt].t=t;
	e[cnt].next=head[u];
	head[u]=cnt;
}
queue<int> q;
void Tup() {
	for (int i=1;i<=n;i++) {
		if (!ru[i]) q.push(i);
	}
	while (!q.empty()) {
		int u=q.front();q.pop();
		tp[++num]=u;
		for (int i=head[u];i!=-1;i=e[i].next) {
			int v=e[i].t;
			ru[v]--;dee[v]=max(dee[v],dee[u]+1);
			if (!ru[v]) q.push(v);
		}
	}
}
int main() {
	freopen("dizzy.in","r",stdin);
	freopen("dizzy.out","w",stdout);
	scanf("%d%d%d",&n,&m1,&m2);
	memset(head,-1,sizeof head);
	for (int i=1,u,v;i<=m1;i++) {
		scanf("%d%d",&u,&v);
		add(u,v);ru[v]++;
	}
	Tup();
	if (num!=n) {
		puts("-1");
		return 0;
	}
	for (int i=1;i<=n;i++) {
		dee[tp[i]]=i;
	}
	for (int i=1;i<=m2;i++) {
		int u,v;
		scanf("%d%d",&u,&v);
		if (dee[u]>dee[v]) swap(u,v);
		printf("%d %d\n",u,v);
	}
}

相关标签: 拓扑