标签:pop include front text algorithm pac 题意 图片 namespace
题意:
给你一张混合图(既有有向边又有无向边),要求你为无向图定向,使得图上没有环。
思路:
拓扑排序
把所有有向边拓扑排序后,每条无向边的方向就是从拓扑序小的连向大的
//By DXY 2018.04.26 //http://hzwer.com/3598.html #include<iostream> #include<cmath> #include<cstdio> #include<cstdlib> #include<cstring> #include<algorithm> #include<queue> #include<stack> #include<map> using namespace std; #define ll long long int n,m,cnt; int d[500000+10],deg[50000+100],head[1000000+10],h[500000+10]; struct node { int to,next; }p[1000000+10]; void add(int x,int y) { cnt++; p[cnt].to=y; p[cnt].next=head[x]; head[x]=cnt; } void topsort() { cnt=0; queue<int>q; for(int i=1;i<=n;i++) if(deg[i]==0) { q.push(i); d[++cnt]=i; } while(q.size()) { int u=q.front(); q.pop(); for(int i=head[u];i;i=p[i].next) { int v=p[i].to; if(--deg[v]==0) { q.push(v); d[++cnt]=v; } } } } int main()//把所有有向边拓扑排序后,每条无向边的方向就是从拓扑序小的连向大的 { int q1,q2; scanf("%d%d%d",&n,&q1,&q2); for(int i=1;i<=q1;i++) { int a,b; scanf("%d%d",&a,&b); deg[b]++; add(a,b); } topsort(); for(int i=1;i<=cnt;i++) h[d[i]]=i; for(int i=1;i<=q2;i++) { int a,b; scanf("%d%d",&a,&b); if(h[a]>h[b]) cout<<b<<" "<<a<<endl; else cout<<a<<" "<<b<<endl; } return 0; }
标签:pop include front text algorithm pac 题意 图片 namespace
原文地址:https://www.cnblogs.com/Dxy0310/p/9534208.html