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;
}