最终采用了DFS求连通分量数目,然后减去一的值即为题目答案。
测试点我卡在测试点二好久,上网看到有的人用并查集也出现了测试点二卡住的情况,测试点二应该是一个这样的问题——是否有重复合并的情况,我修改了好久我最初思路的代码,最后也没通过(如果使用并查集来处理,应该不会出现这样的情况)
错误代码1
#includeusing 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("%dn", n - 2 - get_sum(x, m)); } return 0; }
错误代码2
#include代码实现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("%dn", max(0, n - 2 - get_sum(x, n))); } return 0; }
AC代码
#include学习柳婼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("%dn", tot - 1); } return 0; }
柳神代码和我的AC代码思路一致,她使用的是邻接矩阵存图,我用的vector
#include#include 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("%dn", cnt - 1); } return 0; }
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)