Thema Link
https://pintia.cn/problem-sets/994805046380707840/problems/994805063963230208
Ideen
Für jede Stadt haben wir einen over
Marker over[i]=true
für das iii Städte wurden erobert. Nachdem jede Stadt erobert wurde, markieren wir sie alstrue
und markieren alle ihre verbundenen Städte alstrue
(eigentlich eine Diagrammdurchquerung), und dann vergleichen wir jedes Mal, wenn wir die Vorerfassung und Erfassung vornehmen, die Anzahl der verbundenen Blöcke danach, Wenn festgestellt wird, dass die Anzahl der verbundenen Blöcke zunimmt (mit Ausnahme der eroberten Stadt), wird das Land geteilt, also geben wir aus,Red Alert: City k is lost!
andernfalls müssen wir nur ausgebenity k is lost.
, und schließlich, wenn die Anzahl der eroberten Städte fürnnWenn n , die endgültige AusgabeGame Over.
Code
#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;
}