E. Exits in Excess (graph theory + thinking)

You own a disco called the Boogie Always Persists Club.The club is famous for its multiple interconnected rooms to twist and shout in. The rooms and the corridors between them form a maze-like structure and for added bonus you have made all the corridors one-way. However, it turns out not everyone is as happy with your club as you are. Recently the fire safety inspectors came by and they were not amused by what they saw: if a fire were to break out in one of the rooms, people would have great difficulty finding the fire exits and might even start running around in circles! They find this completely unacceptable and order you to improve things as quickly as possible. They insist that you have to make sure that no one can run around in circles in the club by removing some of the corridors between the rooms.

You, on the other hand, want to retain the attractiveness of the rooms. You do not want to remove too many corridors, because then people will no longer visit your club. You decide that at most half of the corridors may be removed.

Given the layout of the club, remove at most half of the corridors so that no cycles remain.

image.jpg

INPUT:

• One line containing the number of rooms 1 ≤ n ≤ 10^5 and the number of corridors 0 ≤ m ≤ 2 · 10^5.

• Then follow m lines, each containing two different 1-based integers u and v indicating a corridor from room u to room v. There will be no corridor from a room to itself, nor will there be more than one corridor from one room to any other single room.

OUTPUT:

• On the first line, print a single integer 0 ≤ r ≤ m/2, the number of corridors to be removed.

• Then print r lines containing the 1-based indices of the corridors that need to be removed to ensure that dancers cannot go around in circles in the disco anymore.

If there are multiple valid solutions, you may output any one of them.

Sample Input 4-5 Sample Output 4-5
4 5
1 2
2 3
2 4
3 1
4 1 2
4
5
4 3
1 2
2 3
3 4 1
2
The answer to this question is not unique, and all the answers that meet the requirements are correct

Sample input 1 copy
2 2
1 2
2 1
sample output 1 copy
1
2
sample input 2 copy
3 3
1 2
2 3
3 1
sample output 2 copy
1
1
sample input 3 copy
4 5
1 2
1 3
3 2
2 4
3 4 The
sample output 3 copy
0
is really unexpected. . . . . I wrote at that time to isolate a point (or delete the out-side or in-out side of a point), and the result was wa. Later, I found that an isolated point may exceed m even though the extraction degree + the in-degree minimum is the same. /2; So after reading the solution, I realized that I can write it like this, just judge the size of v and u directly; because it is a directed graph, the points can be classified according to the size of the point;
v<u then add in;
v>u then join out;
neither in and out sets can form a ring separately, so just output a smallest size set directly;
but there is a problem, how can we know the smaller of in.size and out.size Must be <=m/2?
In fact, you can think of this: the number of edges in a fully directed graph is n*(n-1)==m; and the edges that need to be removed are at most n;
so n*(n-1)/2-n=int(( n n-2n)/2)>=0;
so the output is actually the value of <=m/2
Code:

#include<bits/stdc++.h>
using namespace std;
vector<int> in,out;
int main(){
    
    
	 int n,m;
	 scanf("%d %d",&n,&m);
	 int x,y;
	 for(int i=0;i<m;i++){
    
    
	 	  scanf("%d %d",&x,&y);
	 	  if(x<y)in.push_back(i+1);
	 	  else out.push_back(i+1);
	 }
	  if(in.size()<out.size()){
    
    
	  	printf("%d\n",in.size());
	  	for(int i=0;i<in.size();i++){
    
    
	  		  printf("%d\n",in[i]);
		  }
	  }else{
    
    
          printf("%d\n",out.size());
	  	for(int i=0;i<out.size();i++){
    
    
	  		  printf("%d\n",out[i]);
		  }
	  }
	return 0;
}

Guess you like

Origin blog.csdn.net/qq_44555205/article/details/104998327