제출 #101127

#제출 시각아이디문제언어결과실행 시간메모리
101127Bruteforceman007 (CEOI14_007)C++11
93 / 100
621 ms21072 KiB
#include "bits/stdc++.h"
using namespace std;
int d[4][200010];
vector <int> g[200010];

void bfs(int src, int r) {
	queue <int> Q;
	Q.push(src);
	d[r][src] = 0;
	while(!Q.empty()) {
		int x = Q.front();
		Q.pop();
		for(auto i : g[x]) {
			if(d[r][i] == -1) {
				d[r][i] = d[r][x] + 1;
				Q.push(i);
			}		
		}
	}
}

int dp[200010], fn[200010];
typedef pair <int, int> pii;

int main(int argc, char const *argv[])
{
	int n, m;
	scanf("%d %d", &n, &m);
	int s, t, a, b;
	scanf("%d %d %d %d", &s, &t, &a, &b);
	for(int i = 1; i <= m; i++) {
		int p, q;
		scanf("%d %d", &p, &q);
		g[p].emplace_back(q);
		g[q].emplace_back(p);
	}
	memset(d, -1, sizeof d);
	bfs(s, 0);
	bfs(t, 1);
	if(d[1][a] > d[1][b]) swap(a, b);
	if(d[1][a] == d[1][b] && d[0][a] < d[0][b]) swap(a, b);
	bfs(a, 2);
	bfs(b, 3);

	int opt = d[1][a] - d[0][a];

	if(d[1][a] < d[0][a] || d[1][b] < d[0][b]) {
		printf("-1\n");
		exit(0);
	}
	if(d[1][a] != d[1][b] && d[0][a] != d[0][b]) {
		printf("%d\n", opt);
		exit(0);
	}
	vector <pii> v;
	for(int i = 1; i <= n; i++) {
		v.emplace_back(-d[0][i], i);
	}
	sort(v.begin(), v.end());

	for(int i = 0; i < v.size(); i++) {
		int x = v[i].second;
		for(int j : g[x]) {
			if(d[0][j] <= d[0][x]) continue;
			if(d[2][j] + d[0][j] == d[0][a] && d[3][j] + d[0][j] == d[0][b]) {
				dp[x] = max(dp[x], 1 + dp[j]);
			}
		}
	}
	v.clear();
	
	for(int i = 1; i <= n; i++) {
		v.emplace_back(-d[1][i], i);
	}
	sort(v.begin(), v.end());
	for(int i = 0; i < v.size(); i++) {
		int x = v[i].second;
		for(int j : g[x]) {
			if(d[1][j] <= d[1][x]) continue;
			if(d[2][j] + d[1][j] == d[1][a] && d[3][j] + d[1][j] == d[1][b]) {
				fn[x] = max(fn[x], 1 + fn[j]);
			}
		}
	}
	if(dp[s] < fn[t] - opt) {
		printf("%d\n", opt - 1);
	} else {
		printf("%d\n", opt);
	}
	return 0;
}

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

007.cpp: In function 'int main(int, const char**)':
007.cpp:61:19: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int i = 0; i < v.size(); i++) {
                 ~~^~~~~~~~~~
007.cpp:76:19: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int i = 0; i < v.size(); i++) {
                 ~~^~~~~~~~~~
007.cpp:28:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d %d", &n, &m);
  ~~~~~^~~~~~~~~~~~~~~~~
007.cpp:30:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d %d %d %d", &s, &t, &a, &b);
  ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
007.cpp:33:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%d %d", &p, &q);
   ~~~~~^~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...