我看这道题的时候想到的是天梯红色警报这道题,都考察了连通性问题,但这么写了一个超内存了hhh 改了半天也没改成功 应该是复原方法有问题就不该用二维数组存 后来查了优秀代码
用的是度、邻接表 开个一维数组来存储每个节点的度 这样空间就是一维 不会超内存了
AC代码:
#include <iostream>
#include <cstring>
#include <vector>
#include <stack>
#include <algorithm>
using namespace std;
const int maxn = 10010;
//度的写法
int n,m,k,x,y;
vector<int> v[maxn];
int cnt[maxn],c[maxn];
int main()
{
cin >> n >> m;
while(m--)
{
cin >> x >> y;
v[x].push_back(y);
v[y].push_back(x);
cnt[x]++;
cnt[y]++;
}
cin >> k;
while(k--)
{
cin >> x;
for(int i = 1; i <= n; i++) //复原
{
c[i] = cnt[i];
}
while(x--)
{
cin >> y;
c[y] = 0;
for(int i = 0; i < v[y].size(); i++)
{
c[v[y][i]]--;
}
}
bool flag = true;
for(int i = 1; i <= n; i++)
{
if(c[i] > 0) flag = false;
}
if(!flag) cout << "NO" << endl;
else cout << "YES" << endl;
}
return 0;
}
错误写法:
#include <iostream>
#include <cstring>
#include <vector>
#include <stack>
#include <algorithm>
using namespace std;
const int maxn = 10010;
int n,m;
int G[maxn][maxn],G1[maxn][maxn];
bool visit[maxn];
void bfs(int index)
{
visit[index] = true;
for(int i = 1; i <= n; i++)
{
if(visit[i] == false && G1[index][i] == 1) visit[i] = true;
}
}
int getcont()
{
int cont = 0;
fill(visit,visit + maxn, false);
for(int i = 1; i <= n; i++)
{
if(visit[i] == false)
{
cont++;
bfs(i);
}
}
return cont;
}
int main()
{
int a,b,k,g,u;
cin >> n >> m;
while(m--)
{
cin >> a >> b;
G[a][b] = G[b][a] = 1;
}
cin >> k;
while(k--)
{
for(int i = 1; i <= n; i++)
{
for(int j = 1; j <= n; j++)
{
G1[i][j] = G[i][j];
}
}
int cont = 0;
cin >> g;
while(g--)
{
cin >> u;
for(int i = 1; i <= n; i++)
{
if(G1[u][i] == 1)
{
G1[u][i] = G1[i][u] = 0;//断点
}
}
cont = getcont();
}
if(cont != n) cout <<"NO" << endl;
else cout << "YES" << endl;
}
return 0;
}