This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
#define ll long long
#define ld long double
#define all(a) (a).begin(), (a).end()
#pragma GCC optimize("O3")
#pragma GCC optimize("Ofast")
#define sz() size()
#define fr first
#define sc second
#define int long long
#define mp make_pair
#define rc(s) return cout<<s,0
#define rcc(s) cout<<s,exit(0)
using namespace std;
const int nmax = 100005;
const long double eps = 1e-12;
long double ans[nmax];
int n,m;
struct varf{
int coef,cons;
}arr[nmax];
int AAA = 0;
long double tz = 0;
vector<pair<int,int>>nod[nmax];
vector<int>vecc;
bitset<nmax>viz;
bitset<nmax>viz2;
void DFS(int s){
vecc.push_back(s);
viz[s] = 1;
for(auto it : nod[s]){
if(!viz[it.fr]){
arr[it.fr].coef = -arr[s].coef;
if(it.sc == 1LL){
arr[it.fr].cons = 1LL - arr[s].cons;
}
else{
arr[it.fr].cons = 2LL - arr[s].cons;
}
DFS(it.fr);
}
else{
int currcons = 0LL;
if(it.sc == 1LL){
currcons = 1LL - arr[s].cons;
}
else{
currcons = 2LL - arr[s].cons;
}
int currcoef = -arr[s].coef;
if(arr[it.fr].coef == currcoef && arr[it.fr].cons != currcons){
rcc("NO");
}
else if(currcoef != arr[it.fr].coef){
AAA = 1;
tz = (long double)(arr[it.fr].cons - currcons)/(currcoef - arr[it.fr].coef);
}
}
}
}
void check(int l,int r,int val){
long double lmao = (long double) (arr[l].coef * tz + arr[l].cons);
lmao += (long double) (arr[r].coef * tz + arr[r].cons);
lmao = (long double) (lmao - val);
if(abs(lmao) >= eps){
rcc("NO");
}
}
map<int,int>q;
void CHECK12(int s){
viz2[s] = 1;
for(auto it : nod[s]){
check(it.fr,s,it.sc);
if(!viz2[it.fr]){
CHECK12(it.fr);
}
}
}
int32_t main(){
cout << fixed << setprecision(13);
cin >> n >> m;
for(int i=1;i<=m;i++){
int x,y,z;
cin >> x >> y >> z;
nod[x].push_back({y,z});
nod[y].push_back({x,z});
}
for(int i=1;i<=n;i++){
if(viz[i] == 0){
AAA = 0;
arr[i].cons = 0;
arr[i].coef = 1;
vecc.clear();
DFS(i);
if(AAA == 1){
CHECK12(i);
for(auto it : vecc){
ans[it] = (long double)arr[it].coef * tz + arr[it].cons;
}
}
else{
q.clear();
for(auto it : vecc){
if(arr[it].coef < 0LL){
q[arr[it].cons]++;
}
else{
q[-arr[it].cons]++;
}
}
auto it = q.begin();
int nec = ((int)vecc.size() + 1)/2;
int curr = (it->sc);
int anslmao = 0;
while(true){
if(curr >= nec){
anslmao = (it->fr);
break;
}
it++;
if(it == q.end()){
break;
}
else{
curr += (it->sc);
}
}
for(auto it : vecc){
ans[it] = anslmao * arr[it].coef + arr[it].cons;
}
}
}
}
cout << "YES" << '\n';
for(int i=1;i<=n;i++) cout << ans[i] << ' ';
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |