1013 Battle Over Cities (25 分)
题目链接
算法分析
最终采用了DFS求连通分量数目,然后减去一的值即为题目答案。
测试点
我卡在测试点二好久,上网看到有的人用并查集也出现了测试点二卡住的情况,测试点二应该是一个这样的问题——是否有重复合并的情况,我修改了好久我最初思路的代码,最后也没通过(如果使用并查集来处理,应该不会出现这样的情况)
错误代码1
#include<bits/stdc++.h>
using namespace std;
#define N 500005
int u[N], v[N], on[N];
int get_sum(int x, int m){
memset(on, 0, sizeof(on));
int tot = 0;
for(int i = 1; i <= m; ++ i){
if(u[i] == x || v[i] == x) continue;
if(!on[u[i]] || !on[v[i]]){
on[u[i]] = on[v[i]] = 1;
tot ++;
}
}
return tot;
}
int main(){
int n, m, k, x;
scanf("%d%d%d", &n, &m, &k);
for(int i = 1; i <= m; ++ i)
scanf("%d%d", &u[i], &v[i]);
for(int i = 1; i <= k; ++ i){
scanf("%d", &x);
printf("%d\n", n - 2 - get_sum(x, m));
}
return 0;
}
错误代码2
#include<bits/stdc++.h>
using namespace std;
#define N 1005
vector< int >vec[N];
int on[N];
int get_sum(int x, int n){
memset(on, 0, sizeof(on));
int tot = 0;
on[x] = 1;
for(int i = 1; i <= n; ++ i){
if(on[i]) continue;
for(int j = 0; j < vec[i].size(); ++ j){
if(vec[i][j] == x) continue;
on[vec[i][j]] = 1;
tot ++;
}
}
return tot;
}
int main(){
int n, m, k, x, y;
scanf("%d%d%d", &n, &m, &k);
for(int i = 1; i <= m; ++ i){
scanf("%d%d", &x, &y);
vec[x].push_back(y);
vec[y].push_back(x);
}
for(int i = 1; i <= k; ++ i){
scanf("%d", &x);
printf("%d\n", max(0, n - 2 - get_sum(x, n)));
}
return 0;
}
代码实现
AC代码
#include<bits/stdc++.h>
using namespace std;
#define N 1005
vector< int >vec[N];
int vis[N];
void Dfs(int u){
vis[u] = 1;
for(int i = 0; i < vec[u].size(); ++ i){
int v = vec[u][i];
if(!vis[v]){
vis[v] = 1;
Dfs(v);
}
}
}
int main(){
int n, m, k, x, y;
scanf("%d%d%d", &n, &m, &k);
for(int i = 1; i <= m; ++ i){
scanf("%d%d", &x, &y);
vec[x].push_back(y);
vec[y].push_back(x);
}
for(int i = 1; i <= k; ++ i){
scanf("%d", &x);
memset(vis, 0, sizeof(vis));
vis[x] = 1;
int tot = 0;
for(int i = 1; i <= n; ++ i)
if(!vis[i]){
Dfs(i);
tot ++;
}
printf("%d\n", tot - 1);
}
return 0;
}
学习柳婼
柳神代码和我的AC代码思路一致,她使用的是邻接矩阵存图,我用的vector
#include <cstdio>
#include <algorithm>
using namespace std;
int v[1010][1010];
bool visit[1010];
int n;
void dfs(int node) {
visit[node] = true;
for(int i = 1; i <= n; i++) {
if(visit[i] == false && v[node][i] == 1)
dfs(i);
}
}
int main() {
int m, k, a, b;
scanf("%d%d%d", &n, &m, &k);
for(int i = 0; i < m; i++) {
scanf("%d%d", &a, &b);
v[a][b] = v[b][a] = 1;
}
for(int i = 0; i < k; i++) {
fill(visit, visit + 1010, false);
scanf("%d", &a);
int cnt = 0;
visit[a] = true;
for(int j = 1; j <= n; j++) {
if(visit[j] == false) {
dfs(j);
cnt++;
}
}
printf("%d\n", cnt - 1);
}
return 0;
}