#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int T, N, M;
int *deg;
vector<int> *edge;
int main()
{
cin >> T;
for (int i = 1; i <= T; i++)
{
cin >> N >> M;
deg = new int[N + 1];
edge = new vector<int>[N + 1];
for (int j = 1; j <= N; j++)
deg[j] = 0;
for (int j = 0; j < M; j++)
{
int x, y;
cin >> x >> y;
deg[x]++;
deg[y]++;
edge[x].push_back(y);
edge[y].push_back(x);
}
for (int j = 1; j <= N; j++)
{
if (deg[j] == 2)
{
int x = edge[j][0];
int y = edge[j][1];
int xsize = edge[x].size();
int ysize = edge[y].size();
for (int k = 0; k < xsize; k++)
{
if (edge[x][k] == y)
{
edge[j].erase(edge[j].begin(), edge[j].end());
vector<int>::iterator it;
it = find(edge[x].begin(), edge[x].end(), j);
edge[x].erase(it);
it = find(edge[y].begin(), edge[y].end(), j);
edge[y].erase(it);
deg[j] = 0;
deg[x]--;
deg[y]--;
j = min(min(x, y), j) - 1;
break;
}
}
}
}
int cnt = 0;
for (int j = 1; j <= N; j++)
if (deg[j] != 0)
cnt++;
cout << "Case #" << i << endl;
cout << cnt << endl;
delete[] deg;
delete[] edge;
}
return 0;
}
73점 시간초과...
vector의 erase는 O(N)이니 시간초과가 뜰 수 밖에.. edge를 vector 대신 set으로 만들어뒀어야 함
그리고 애초에 틀린 풀이인 것 같은데? 예를 들어 0-1 1-2 1-3 2-3 1-4 2-4 와 같이 4가 지워진 이후에 2나 3이 지워질 수 있는 형태를 생각해보면 그런 경우가 고려되고있는거 맞아?
ㄴ 고거 밑에서 j를 조정해줬어요
erase O(N) 이었구나..
아 j 조정하는걸 못봤네 근데 뭔가 100 지워지고 99 지워지고 98 지워지고 97 지워지고 이런 형태고, 100에 1과 99가 연결되어있고 99에 2와 98이 연결되어있고 이런식으로 만들어서 O(N^2)짜리 저격 데이터 만들 수 있을 것 같음. j를 조정하는 것 보다 queue로 다음에 방문할 것들을 관리하는 방식으로 바꿔야댐
코드 잘봤습니다
오 그런 방법이 있었네요