E. Voyages (Effacer ensemble + Analyse)

titre

Signification des questions:

    Il y a n personnes, chaque jour il y a deux hommes sont devenus de bons amis. Maintenant, nous devons prendre des dispositions de voyage pour tout le monde, s'il allait, alors ses amis doivent aller au moins k. Sortie à organiser les gens tous les jours.
     2 n 2 1 0 5 , 1 m 2 1 0 5 , 1 k < n 2≤n≤2⋅10 ^ ^ 5,1≤m≤2⋅10 5, 1≤k <n

analyse:

    Tout d' abord, nous pouvons utiliser le graphique de la relation pour représenter, cette question fait l'objet d'une carte thématique. Pour personne un peut aller au sous-graphe, chaque point de l'image secondaire soit supérieur ou égal à k. Si une personne n'a pas les derniers amis k, alors naturellement nous ne pouvons pas le considérer, alors nous pouvons le mettre supprimé. Dans ce cas , nous devons tenir compte de la traverse, de sorte que nous pouvons supprimer le bord, donc supprimer le point, de maintenir un sous-graphe pour répondre aux conditions.
    Pour une opération d'effacement de la frontière, afin de maintenir ensemble à l' aide figure naturelle. Pour une des conditions de point ne sont pas satisfaits, nous pouvons simplement laisser supprimer. En raison de la suppression de ce point , il peut conduire à une réaction en chaîne, donc nous devons maintenir le processus de recherche supprimer ce point. Pour la recherche en profondeur, il peut être supprimé lors de la suppression de ce bord en raison de l'effet d' entraînement pour traverser le côté arrière, ce qui provoque des problèmes semblent traverser, donc je l' habitude de faire une recherche large, point une suppression et propre avant d' envisager quoi que ce soit d' autre que vous voulez supprimer au point.

#include <iostream>
#include <set> 
#include <queue>
using namespace std;

set<int> g[200005]; 
int x[200005],y[200005],vis[200005],ans;
vector<int> res;
queue<int> q;

void todo(int k)
{
	while( !q.empty() )
	{
		int x = q.front();
		q.pop();
		set<int>::iterator it;
		for (it = g[x].begin(); it != g[x].end(); it++)
		{
			if( vis[*it] ) continue;
			g[*it].erase(x);
			if( g[*it].size() < k )
			{
				vis[*it] = 1;
				ans --;
				q.push(*it);
			}
		}
	}
}

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	int n,m,k;
	cin >> n >> m >> k;
	ans = n; 
	for (int i = 1; i <= m; i++)
	{
		cin >> x[i] >> y[i];
		g[x[i]].insert(y[i]);
		g[y[i]].insert(x[i]);
	}
	for (int i = 1; i <= n; i++)
	{
		if( g[i].size() < k )
		{
			q.push(i);
			vis[i] = 1;
			ans --;
		}
	}
	todo(k);
	res.push_back(ans);
	for (int i = m; i > 1; i--)
	{
		if( vis[x[i]] == 0 && vis[y[i]] == 0 )
		{
			g[x[i]].erase(y[i]);
			g[y[i]].erase(x[i]);
			if( g[x[i]].size() < k )
			{
				vis[x[i]] = 1;
				q.push(x[i]);
				ans --;
			}
			if( g[y[i]].size() < k )
			{
				vis[y[i]] = 1;
				q.push(y[i]);
				ans --;
			}
			todo(k);
		}
		res.push_back(ans);
	}
	for (int i = res.size() - 1; i >= 0; i--)
	{
		cout << res[i] << '\n';
	}
	return 0;
}

Publié 132 articles originaux · a gagné les éloges 6 · vues 7932

Je suppose que tu aimes

Origine blog.csdn.net/weixin_44316314/article/details/104812847
conseillé
Classement