L2-013 红色警报

判断图的连通性三种做法,dfs,bfs,并查集。
本题dfs。edges为可达矩阵,若i能够到达j,则edges[i][j]=1且edges[j][i]=0反之为0,因为是无向图,所以两个都要存。
一开始出了点问题,我在删除那个节点之后,将edges[i][j]置为0,但是没将edges[j][i]=0,郁闷半天...

#include <bits/stdc++.h>
using namespace std;
int visited[510],edges[510][510];//初始都未被访问过
int n,m;
void dfs(int x) {
	for(int i=0; i<n; i++) {
		if(!visited[i]&&edges[x][i]) {
			visited[i]=1;
			dfs(i);
		}
	}
}
int main() {
	cin>>n>>m;
	for(int i=0; i<m; i++) {
		int a,b;
		cin>>a>>b;
		edges[a][b]=1;
		edges[b][a]=1;
	}
	int c=0;//连通图的数量
	for(int i=0; i<n; i++) {
		if(!visited[i]) {
			visited[i]=1;
			dfs(i);
			c++;
		}
	}
	cin>>m;
	int last=c;
	int rest=n;
	for(int i=0; i<m; i++) { //枚举删除的城市
	    rest--;
		memset(visited,0,sizeof(visited));
		c=0;
		int city;
		cin>>city;
		for(int i=0; i<n; i++) {
			edges[city][i]=0;
			edges[i][city]=0;
		}
		for(int i=0; i<n; i++) {
			if(!visited[i]) {
				visited[i]=1;
				dfs(i);
				c++;
			}
		}
		if(c>last+1) {
			cout<<"Red Alert: City "<<city<<" is lost!\n";
		} else {
			cout<<"City "<<city<<" is lost.\n";
		}
		last=c;
		if(rest==0) cout<<"Game Over.";
	}
	return 0;
}
posted @ 2024-03-15 19:08  YuKiCheng  阅读(29)  评论(0编辑  收藏  举报