Submission #974001

#TimeUsernameProblemLanguageResultExecution timeMemory
974001Onur_IlgazGraph (BOI20_graph)C++17
100 / 100
123 ms28768 KiB
#include <bits/stdc++.h>
#define fast cin.tie(0)->sync_with_stdio(0);
#define int long long
#define inf ((int)1e18)
using namespace std;
const int N = 100001;
vector <pair<int, int> > adj[N];
int root[N], sign[N];
bitset <N> cons;
double val[N], add[N];
vector <double> idk;

double calc(int node) {
	return val[node] + add[root[node]] * sign[node];
}

void dfs1(int node, int comp, bool sgn) { // constant olabilenleri constant yap
	sign[node] = sgn ? 1 : -1;
	root[node] = comp;
	idk.push_back(val[node] * sign[node]);
	for(auto [to, w]:adj[node]) {
		if(!root[to]) {
			val[to] = w - val[node];
			dfs1(to, comp, !sgn);
		}
		else {
			if(cons[root[node]]) {
				if(calc(node) + calc(to) != w) {
					cout << "NO";
					exit(0);
				}
			}
			else {
				if(sign[node] == sign[to]) {
					cons[root[node]] = 1;
					double diff = w - (val[node] + val[to]);
					add[root[node]] = diff / 2 * sign[node];
				}
				else {
					if(val[node] + val[to] != w) {
						cout << "NO";
						exit(0);
					}
				}
			}
		}
	}
}

int32_t main(){
	fast
	int n, m;
	cin >> n >> m;
	for(int i = 0; i < m; i++) {
		int a, b, w;
		cin >> a >> b >> w;
		adj[a].push_back({b, w});
		adj[b].push_back({a, w});
	}
	for(int i = 1; i <= n; i++) {
		if(root[i]) continue;
		idk.clear();
		dfs1(i, i, 1);
		// if inconsistent, then do some value adjustments
		if(!cons[i]) {
			sort(idk.begin(), idk.end());
			double midi = idk[idk.size() / 2];
			add[i] = -midi;
			//cout << midi << "\n";
		}
	}
	cout << "YES\n";

	for(int i = 1; i <= n; i++) {
		cout << calc(i) << " ";
	}
}
#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...