Submission #286130

#TimeUsernameProblemLanguageResultExecution timeMemory
286130spdskatrGraph (BOI20_graph)C++14
100 / 100
200 ms17008 KiB
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <vector>
#include <utility>
#include <cmath>
#define fi first
#define se second
#define eps 0.000001

using namespace std;
typedef pair<int, int> pii;
int N, M, seen[100005], fac[100005], con[100005];
double val[100005];
vector<pii> graph[100005];
vector<int> nds, elems;
int founda = 0, rip = 0;
double aval = 0;

void ripexit() {
	printf("NO\n");
	exit(0);
}

void dfs(int x) {
	//printf("%d: x%d c%d\n", x, fac[x], con[x]);
	nds.push_back(x);
	seen[x] = 1;
	for (pii p : graph[x]) {
		int v = p.fi, k = p.se;
		if (seen[v]) {
			if (fac[v] + fac[x]) {
				// A value is determined.
				double pval = (k - (con[v] + con[x]))/((double)(fac[v] + fac[x]));
				if (founda) { 
					if (fabs(pval - aval) > eps) {
						rip = 1;
					}
				} else {
					founda = 1;
					aval = pval;
				}
			} else {
				if (con[v] + con[x] != k) {
					rip = 1;
				}
			}
		} else {
			fac[v] = -fac[x];
			con[v] = k - con[x];
			dfs(v);
		}
	}
}

int main() {
	scanf("%d %d", &N, &M);
	for (int i = 0; i < M; i++) {
		int a, b, c;
		scanf("%d %d %d", &a, &b, &c);
		graph[a].push_back({ b, c });
		graph[b].push_back({ a, c });
	}
	for (int i = 1; i <= N; i++) {
		if (!seen[i]) {
			founda = 0, rip = 0;
			fac[i] = 1;
			con[i] = 0;
			dfs(i);
			if (rip) {
				ripexit();
			}
			if (!founda) {
				elems.clear();
				for (int x : nds) {
					elems.push_back(con[x] * fac[x]);
				}
				sort(elems.begin(), elems.end());
				aval = -elems[elems.size()/2];
			}
			for (int x : nds) {
				val[x] = fac[x] * aval + con[x];
			}
			nds.clear();
		}
	}
	printf("YES\n");
	for (int i = 1; i <= N; i++) {
		if (i == 1) printf("%lf", val[i]);
		else printf(" %lf", val[i]);
	} printf("\n");
}

Compilation message (stderr)

Graph.cpp: In function 'int main()':
Graph.cpp:57:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   57 |  scanf("%d %d", &N, &M);
      |  ~~~~~^~~~~~~~~~~~~~~~~
Graph.cpp:60:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   60 |   scanf("%d %d %d", &a, &b, &c);
      |   ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...