传送门:https://vjudge.net/contest/370208#problem/E
题意
n个点m条边的有向图,最多删除m/2条边,要求删边后的有向图没有环,求删边的个数和删第几条边。
思路
设u<v的边集为A,u>v为B,我们删去A和B中小的那个边集就行,为什么呢?我们来看环的形成比如1 2 3这三个节点有1到2,2到3,3到1三条边成环,那么这些边必有u<v且有u>v,因为要首尾相接嘛,所以我们删去一个集合这个图就一定没有环了,那么为什么在m/2以内呢,因为是两个集合较少的那个嘛!
AC代码
#include<iostream> #include<vector> using namespace std; vector<int> A,B; int n,m,u,v; int main() { cin>>n>>m; for(int i=1;i<=m;i++){ cin>>u>>v; if(u<=v) A.push_back(i); else B.push_back(i); } if(A.size()<B.size()){ cout<<A.size()<<' '; for(auto now:A) cout<<now<<' '; } else{ cout<<B.size()<<' '; for(auto now:B) cout<<now<<' '; } return 0; }