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>
using namespace std;
using ld = long double;
int inf = 1e9 + 123;
int n, m;
vector<pair<int,int>> g[100005];
vector<vector<int>> cc;
vector<int> cur_cc;
vector<ld> vls;
bool viz[100005];
ld coef[100005], ofs[100005];
ld ans[100005];
bool possible = true;
ld trb_x = inf;
void dfs(int nod)
{
viz[nod] = true;
cur_cc.push_back(nod);
for (auto vecin : g[nod])
{
if (!viz[vecin.first])
{
coef[vecin.first] = -coef[nod];
ofs[vecin.first] = vecin.second - ofs[nod];
dfs(vecin.first);
}
else
{
ld ncf = -coef[nod];
ld nofs = vecin.second - ofs[nod];
if (ncf == coef[vecin.first] and nofs != ofs[vecin.first])
possible = false;
else if (ncf != coef[vecin.first])
{
//cout << nod << ' ' << vecin.first << ' ' << ncf << ' ' << nofs << ' ' << coef[vecin.first] << ' ' << ofs[vecin.first] << endl;
ld ex_x = trb_x;
if (ncf == -1)
trb_x = (ld)(nofs - ofs[vecin.first]) / 2.0d;
else
trb_x = (ld)(ofs[vecin.first] - nofs) / 2.0d;
//cout << ex_x << ' ' << trb_x << endl;
if (ex_x != trb_x and ex_x != inf)
possible = false;
}
}
}
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
cin >> n >> m;
for (int i = 1; i <= m; i++)
{
int x, y, z;
cin >> x >> y >> z;
g[x].push_back({y, z});
g[y].push_back({x, z});
}
for (int i = 1; i <= n; i++)
{
if (!viz[i])
{
trb_x = inf;
cur_cc.clear();
coef[i] = 1, ofs[i] = 0;
dfs(i);
cc.push_back(cur_cc);
vls.push_back(trb_x);
}
}
if (!possible)
{
cout << "NO";
return 0;
}
for (int i = 0; i < cc.size(); i++)
{
if (vls[i] != inf)
{
for (auto it : cc[i])
ans[it] = coef[it] * vls[i] + ofs[it];
}
else
{
vector<ld> pct;
for (auto it : cc[i])
pct.push_back(-ofs[it] / coef[it]);
sort(pct.begin(), pct.end());
int pz = pct.size() / 2;
vls[i] = pct[pz];
for (auto it : cc[i])
ans[it] = coef[it] * vls[i] + ofs[it];
}
}
cout << "YES\n";
cout << setprecision(10) << fixed;
for (int i = 1; i <= n; i++)
cout << ans[i] << ' ';
return 0;
}
/*
3 3
1 2 1
2 3 2
1 3 2
*/
Compilation message (stderr)
Graph.cpp: In function 'int main()':
Graph.cpp:86:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::vector<int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
86 | for (int i = 0; i < cc.size(); 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... |