제출 #419701

#제출 시각아이디문제언어결과실행 시간메모리
419701VladM어르신 집배원 (BOI14_postmen)C++14
55 / 100
684 ms49212 KiB
#include <cstdio>
#include <set>
#include <vector>
#include <algorithm>
using namespace std;
const int MaxN = 1000010,
	  	  MaxM = 2*1000010;
typedef pair<int,int> pii;

set<pii> S;

int E[MaxM][3];
int pr[MaxN] = {0};

int P[MaxN], tmp[MaxN] = {0}, C[MaxN];
int k[MaxM];

int N, M, a, b;


int ANS_cc[MaxM];
int ANS_C = 0;
int ANS_T = 0;
int ANS[2*MaxM];

bool visited[MaxN] = {0};
vector<int> path;

int RET = -1;

int getU (int i, int v) {
	return (v == E[i][0]) ? E[i][1] : E[i][0];
}

pii mpair (int a, int b) {
	return pair<int, int> (min(a,b), max(a,b));
}

void dfs(int v) {
	visited[v] = true;
	path.clear();
	path.push_back(v);	
	while (v != -1) {
		//printf("V = %d!!!\n", v);
		visited[v] = true;
		int newv = -1;
		for (; pr[v] < C[v]; pr[v]++) {
			int i = pr[v],
				u = getU(k[P[v]+i], v);
				if (S.find(mpair(u, v)) == S.end()) {
					S.insert(mpair(u, v));
					if (visited[u]) {
						//printf("RADOM\n");
						newv = u;
						while (path.back() != u) {
							ANS[ANS_T++] = path.back();
							ANS_cc[ANS_C]++;
							visited[path.back()] = false;
							path.pop_back();
						} 
						ANS[ANS_T++] = path.back();
						ANS_cc[ANS_C]++;
						ANS_C++;
					}else {
						newv = u;
						path.push_back(u);
					}
					break;
				}
		}
		if (newv == -1 && path.size() > 1) {
			newv = path.back(); 
			path.pop_back();	
		}
		v =newv;
	}
}


int main() {
	path.reserve(MaxN + 100);	
	scanf("%d%d\n", &N, &M);
	for (int i = 0; i < M; i++) {
		scanf("%d%d", &E[i][0], &E[i][1]);
		E[i][2] = false;
		C[E[i][0]]++;
		C[E[i][1]]++;
	}
    
	P[1] = 0;
	for (int i = 2; i <= N; i++) {
		P[i] = P[i-1] + C[i-1];
	}
	for (int i = 0; i < M; i++) {
		//printf("E: %d %d\n", E[i][0], E[i][1]);
		k[P[E[i][0]] + tmp[E[i][0]]] = i;
		k[P[E[i][1]] + tmp[E[i][1]]] = i;
		tmp[E[i][0]]++;
		tmp[E[i][1]]++;
	}

	for (int i = 1; i <= N; i++)
		dfs(i);	
	
	ANS_T = 0;
	
	//printf("%d\n", ANS_C);
	for(int i = 0; i < ANS_C; i++) {
		//printf("%d", ANS_cc[i]);
		for (int j = 0; j < ANS_cc[i]; j++)
			printf(" %d", ANS[ANS_T++]);
		printf("\n");
	}
	
	return 0;
}

컴파일 시 표준 에러 (stderr) 메시지

postmen.cpp: In function 'int main()':
postmen.cpp:82:7: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   82 |  scanf("%d%d\n", &N, &M);
      |  ~~~~~^~~~~~~~~~~~~~~~~~
postmen.cpp:84:8: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   84 |   scanf("%d%d", &E[i][0], &E[i][1]);
      |   ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...