L2-013 Alerta roja (DFS+Stain)

enlace de tema

https://pintia.cn/problem-sets/994805046380707840/problems/994805063963230208

ideas

Para cada ciudad tenemos un overmarcador over[i]=truepara el iii ciudades han sido capturadas Después de capturar cada ciudad, la marcamos comotruey marcamos todas sus ciudades conectadas comotrue(en realidad, un gráfico transversal), y luego cada vez que tomamos la captura previa y capturamos Comparamos el número de bloques conectados después, si se encuentra que la cantidad de bloques conectados aumenta (excluyendo la ciudad que fue capturada), entonces el país se divide, por lo que generamos, deRed Alert: City k is lost!lo contrario, solo necesitamos generarity k is lost., y finalmente si la cantidad de ciudades capturadas parannSi n , la salida finalGame Over.

código

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define mod 1000000007
#define endl "\n"
#define PII pair<int,int>
#define INF 0x3f3f3f3f

const int N = 5e2+10;

bool mp[N][N];
bool vis[N],over[N];
int n,m;

void dfs(int u){
    
    
	if(vis[u]) return;
	vis[u] = true;
	for(int i = 0;i < n; ++i) {
    
    
		if(i != u && mp[u][i] && !over[i])
			dfs(i);
	}
}

int get_num(){
    
    
	int ans = 0;
	memset(vis,false,sizeof vis);
	for(int i = 0;i < n; ++i) {
    
    
		if(!vis[i] && !over[i]){
    
    
			dfs(i);
			ans++;
		}
	}
	return ans;
}

int main()
{
    
    
	ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
	cin>>n>>m;
	int u,v;
	for(int i = 1;i <= m; ++i) {
    
    
		cin>>u>>v;
		mp[u][v] = mp[v][u] = true;
	}
	int k,t,num = get_num();
	cin>>k;
	for(int i = 1;i <= k; ++i) {
    
    
		cin>>t;
		over[t] = true;
		int loc = get_num();
		if(loc > num) {
    
    	
			cout<<"Red Alert: City "<<t<<" is lost!"<<endl;
		} else {
    
    
			cout<<"City "<<t<<" is lost."<<endl;
		}
		num = loc;
			
	}
	if(k == n) cout<<"Game Over."<<endl;
	
	return 0;
}

Supongo que te gusta

Origin blog.csdn.net/m0_46201544/article/details/123937521
Recomendado
Clasificación