L2-013 Alarmstufe Rot (DFS+Fleck)

Thema Link

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

Ideen

Für jede Stadt haben wir einen overMarker over[i]=truefür das iii Städte wurden erobert. Nachdem jede Stadt erobert wurde, markieren wir sie alstrueund 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;
}

Ich denke du magst

Origin blog.csdn.net/m0_46201544/article/details/123937521
Empfohlen
Rangfolge