제출 #1260488

#제출 시각아이디문제언어결과실행 시간메모리
1260488jerzykGraph (BOI20_graph)C++20
100 / 100
107 ms28868 KiB
#include <iostream>
#include <vector>
#include <algorithm>
#include <iomanip>

using namespace std;
typedef long long ll;
typedef long double ld;

#define st first
#define nd second
#define f(a, c, b) for (int a = c; b > a; a++)
#define pb push_back
#define all(a) a.begin(), a.end()
#define wczytaj(a, c, n) a.resize(n); f(i, c, n) cin >> a[i];
#define sz(a) int(a.size())
#define wypisz(a, c) f(i, c, sz(a)) cout << a[i] << " "; cout << "\n";

const ll BRAK = -21372137;
const ll MNOZ = 1000000;

int n, m;

vector<ld> odp;
vector<vector<pair<ll, ll>>> sasiedzi;
vector<ll> odw; //do dfs ktory bedzie sprawdzac poprawnosc
vector<pair<ld, ll>> zmienne; //wartosci pod dfsie ze zmienna - kazda spojna rozwazamy osobno no i fajnie
vector<ll> aktl_spojna;
bool dziala = true;
ld kand;
ld jakie_x;
ld c;
ld suma_stale;
ld suma_x;

vector<ld> wspolczynniki;

void dfs(int v) {
	if (!dziala) return;
	odw[v] = 1;
	aktl_spojna.pb(v);
	for (pair<ll, ll> sasd: sasiedzi[v]) {
		if (!odw[sasd.st]) { //jesli jest nieodwiedzony to ustalam go na podstawie starego i jest fajnie
			zmienne[sasd.st] = {sasd.nd - zmienne[v].st,-zmienne[v].nd};
			dfs(sasd.st);
		} else { //trzeba sprawdzic czy sie zgadza
			if (zmienne[sasd.st].nd == zmienne[v].nd) {
				suma_x = zmienne[sasd.st].nd + zmienne[v].nd;
				suma_stale = zmienne[sasd.st].st + zmienne[v].st;
				c = (sasd.nd) - suma_stale;
				kand = ld(c)/ld(suma_x);
				if (jakie_x == BRAK) {
					jakie_x = kand;
				} else if (jakie_x != kand) {
					dziala = false;
					return;
				}
			} else {
				if (int(zmienne[sasd.st].st + zmienne[v].st) != sasd.nd) {
					dziala = false;
					return;
				}
			}
		}
	}
}

int main() {
	ios_base::sync_with_stdio(0);
	cin.tie(0);
	
	cin >> n >> m;
	
	odp.resize(n + 1, BRAK);
	
	int w1, w2, w3;
	sasiedzi.resize(n + 1);
	
	f(i, 0, m) {
		cin >> w1 >> w2 >> w3;
		sasiedzi[w1].pb({w2, w3 * MNOZ});
		sasiedzi[w2].pb({w1, w3 * MNOZ});
	}
	
	odw.resize(n + 1, 0);
	zmienne.resize(n + 1);
	f(i, 1, n + 1) {
		if (odw[i]) continue;
		aktl_spojna.clear();
		zmienne[i] = {0, 1};
		jakie_x = BRAK;
		dfs(i);
		if (!dziala) {
			cout << "NO";
			return 0;
		}
		if (jakie_x != BRAK) {
			for (int ele: aktl_spojna) {
				odp[ele] = ld(zmienne[ele].st) + jakie_x * ld(zmienne[ele].nd);
			}
		} else {
			wspolczynniki.clear();
			for (int ele: aktl_spojna) {
				if (zmienne[ele].nd == -1) {
					wspolczynniki.pb(-zmienne[ele].st);
				} else {
					wspolczynniki.pb(zmienne[ele].st);
				}
			}
			sort(all(wspolczynniki));
			if (sz(wspolczynniki)%2 == 1) {
				jakie_x = -(wspolczynniki[sz(wspolczynniki)/2]);
			} else {
				jakie_x = -((wspolczynniki[sz(wspolczynniki)/2] + wspolczynniki[(sz(wspolczynniki)/2) - 1])/2);
			}
			for (int ele: aktl_spojna) {
				odp[ele] = ld(zmienne[ele].st) + jakie_x * ld(zmienne[ele].nd);
			}
		}
	}
	
	cout << "YES\n";
	f(i, 1, n + 1) {
		cout << fixed << setprecision(6) << (odp[i]/ld(MNOZ)) << " ";
	}
	
	return 0;
}
#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...