제출 #751587

#제출 시각아이디문제언어결과실행 시간메모리
751587javotazGraph (BOI20_graph)C++17
100 / 100
194 ms20972 KiB
// be nam khodavand jano kherad     kazin bartar andishe bar nagzarad
#include<bits/stdc++.h>
using namespace std;
 
const int N = 1e5 + 12;
int n, m, bakhsh[N], omgh[N];
double x[N], check;
bool mrk[N];
vector<pair<int, int> > g[N], xs;
 
void output() {
	cout << "YES\n";
	for (int i = 1; i <= n; i++)
		cout << x[i] << ' ';
}
 
void wrong_output() {
	cout << "NO\n";
	exit(0);
}
 
void check_ans(int a) {
	for (auto i: g[a]) {
		int v = i.first;
		int dis = i.second;
		if (mrk[v]) {
			if (dis - x[a] != x[v])
				wrong_output();
		}
		else {
			mrk[v] = true;
			x[v] = dis - x[a];
			check_ans(v);
		}
	}
}
 
void dfs(int u) {
	for (auto i: g[u]) {
		int v = i.first;
		if (omgh[v] == omgh[u]) {
			check = (x[v] * -1 * omgh[v] + ((i.second - x[u]) * omgh[u])) / 2.0; 
			return;
		}
		if (!omgh[v]) {
			omgh[v] = omgh[u] * -1;
			x[v] = i.second - x[u];  
			dfs(v);
		}
	}
}
 
void dfs_fill_x(int a) {
	for (auto i: g[a]) {
		int u = i.first;
		omgh[u] = omgh[a] * -1;
		int tmp = (i.second - omgh[a] * x[a]) * omgh[u];
		if (mrk[u]) {
			if (x[u] != tmp)
				wrong_output();
		}
		else {
			x[u] = tmp;
			xs.push_back({tmp, u});
			mrk[u] = true;
			dfs_fill_x(u);
		}
	}
}
 
void minimize_output() {
	sort(xs.begin(), xs.end());
	int tmp = xs.size();
	tmp /= 2;
	int r = xs[tmp].first;
	for (auto i: xs) 
		x[i.second] = (i.first - r) * omgh[i.second];
}
 
bool do_bakhshi(int u) {
	bool res = true;
	for (auto i: g[u]) {
		int v = i.first;
		if (bakhsh[v] == bakhsh[u])
			return false;
		if (!bakhsh[v]) {
			bakhsh[v] = (bakhsh[u] == 1)? 2 : 1;
			res &= do_bakhshi(v);
		}
	}
	return res;
}
 
void solve() {
	for (int i = 1; i <= n; i++) {
		if (!mrk[i]) {
			xs.clear();
			xs.push_back({0, i});
			check = 0;
			bakhsh[i] = 1;
			omgh[i] = 1;
			mrk[i] = true;
			if (do_bakhshi(i)) dfs_fill_x(i), minimize_output();
			else {
				dfs(i);
				x[i] = check;
				check_ans(i);
			}
		}
	}
}
 
void input() {
	cin >> n >> m;
	for (int i = 0; i < m; i++) {
		int u, v, color;
		cin >> u >> v >> color;
		g[u].push_back({v, color});
		g[v].push_back({u, color});
	}
}
 
int main() {
	ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0);
	input(), solve(), output();
}
 
// migan garme bazar kheila
#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...