enlace de tema
https://pintia.cn/problem-sets/994805046380707840/problems/994805063963230208
ideas
Para cada ciudad tenemos un over
marcador over[i]=true
para el iii ciudades han sido capturadas Después de capturar cada ciudad, la marcamos comotrue
y 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;
}