P2017 [USACO09DEC]Dizzy Cows G - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
![](https://i-blog.csdnimg.cn/blog_migrate/7d2b3a0712f312a064f033f3a67e3d80.png)
#include <bits/stdc++.h>
#include <iostream>
#include<unordered_map>
#define x first
#define y second
#define ios ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
using namespace std;
typedef long long LL ;
typedef unsigned long long ULL ;
typedef pair<int,int> PII ;
typedef pair<LL,int> PLI ;
const int N = 1e7 + 10 ,M=1000 + 10;
const LL INF2 = 1e17;
int n,m1,m2,h[N],ne[N],e[N],idx,q[N];
int d[N];// 记录入度
int v[N]; // 这个点 出队的 先后顺序
void add(int a,int b)
{
e[idx]=b,ne[idx]=h[a],h[a]= idx ++ ;
}
int cnt;
inline void solve()
{
cin >> n>> m1 >> m2;
::memset(h,-1,sizeof h);
for(int i=1;i<=m1;i ++ ) // 读入有向边
{
int x,y;cin >> x >> y;
add(x,y);
d[y] ++ ;
}
int hh =1,tt=1;
for(int i=1;i <= n; i++ ) if(d[i] == 0) q[tt ++ ] = i;
// 将所有 入度为0 的点 拓扑排序
// 入度 少的 先进 队列
while(hh <= tt )
{
int t = q[hh ++ ];
v[t] = ++ cnt ;
for(int i=h[t];~i;i=ne[i])
{
if(-- d[e[i]] == 0 ) q[tt ++ ] = e[i];
}
}
for(int i=1;i<=m2; i++ ) // 读入无向边
{
int x,y;
cin >> x >> y;
if(v[x] < v[y])cout << x << " " << y <<endl;
// 一定不存在 y ->x 的路径 到达x的方式 比 到达y的少 , 即 出队时间早的 向 出队时间晚的 连边
else cout << y << " " << x << endl;
}
}
signed main()
{
ios
int T=1;
// cin>>T;
while(T -- )
{
solve();
}
return 0;
}