Submission #246194

#TimeUsernameProblemLanguageResultExecution timeMemory
246194mieszko11b007 (CEOI14_007)C++14
100 / 100
331 ms18356 KiB
#include <bits/stdc++.h>

using namespace std;

int n, m;
int s, d, a, b;
vector<int> G[200007];
int dista[200007], distb[200007], dists[200007], distd[200007];
bool vis[200007];

void run_bfs(int w, int *dist) {
	memset(vis, 0, sizeof vis);
	vis[w] = 1;
	dist[w] = 0;
	queue<int> Q;
	Q.push(w);
	
	while(!Q.empty()) {
		int u=  Q.front();
		Q.pop();
		
		for(int v : G[u]) {
			if(!vis[v]) {
				vis[v] = 1;
				dist[v] = dist[u] + 1;
				Q.push(v);
			}
		}
	}
}

int main() {
	scanf("%d%d%d%d%d%d", &n, &m, &s, &d, &a, &b);
	while(m--) {
		int a, b;
		scanf("%d%d", &a, &b);
		G[a].push_back(b);
		G[b].push_back(a);
	}
	
	run_bfs(s, dists);
	run_bfs(d, distd);
	run_bfs(a, dista);
	run_bfs(b, distb);
	int sa = dists[a], sb = dists[b];
	int da = distd[a], db = distd[b];
	
	if(sa != sb || da != db) {
		int val = min(da - sa, db - sb);
		if(val < 0) val = -1;
		
		printf("%d\n", val);
	} else {
		int fs = 0, fd = 0;
		for(int i = 1 ; i <= n ; i++) {
			if(dists[i] + dista[i] == sa && dists[i] + distb[i] == sb)
				fs = max(fs, dists[i]);
			if(distd[i] + dista[i] == da && distd[i] + distb[i] == db)
				fd = max(fd, distd[i]);
		}
		
		int val = min(da - sa, db - sb);
		if(sa - fs > da - fd)
			val--;
			
		if(val < 0) val = -1;
			
		printf("%d\n", val);
	}
	
	return 0;
}

Compilation message (stderr)

007.cpp: In function 'int main()':
007.cpp:33:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d%d%d%d%d%d", &n, &m, &s, &d, &a, &b);
  ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
007.cpp:36:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%d%d", &a, &b);
   ~~~~~^~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...