제출 #1030645

#제출 시각아이디문제언어결과실행 시간메모리
1030645ttamxGraph (BOI20_graph)C++17
58 / 100
68 ms21092 KiB
#include<bits/stdc++.h> using namespace std; using db = double; const int N=1e5+5; const db INVPHI=(sqrt(db(5))-1)/2; int n,m; vector<int> adj[N]; bool vis[N]; int a[N],b[N],ans[N]; int main(){ cin.tie(nullptr)->sync_with_stdio(false); cin >> n >> m; vector<vector<pair<int,int>>> adj(n); for(int i=0;i<m;i++){ int u,v,w; cin >> u >> v >> w; u--,v--; adj[u].emplace_back(v,w); adj[v].emplace_back(u,w); } vector<int> comp; pair<int,int> val; bool found=false; function<void(int)> dfs=[&](int u){ comp.emplace_back(u); vis[u]=true; for(auto [v,w]:adj[u]){ if(!vis[v]){ a[v]=-a[u]; b[v]=w-b[u]; dfs(v); }else{ if(a[u]+a[v]==0){ if(b[u]+b[v]!=w){ cout << "NO",exit(0); } }else{ int num=w-b[u]-b[v]; int den=a[u]+a[v]; if(!found){ found=true; val={num,den}; }else if(num*val.second!=val.first*den){ cout << "NO",exit(0); } } } } }; for(int i=0;i<n;i++)if(!vis[i]){ comp.clear(); found=false; a[i]=1,b[i]=0; dfs(i); auto calc=[&](int x){ int res=0; for(auto u:comp){ res+=abs(a[u]*x+b[u]*2); } return res; }; auto answer=[&](int x){ for(auto u:comp){ ans[u]=a[u]*x+b[u]*2; } }; if(found){ answer(val.first*2/val.second); }else{ int c=comp.size(); int l=-c*2-1,r=c*2+1; while(r-l>4){ int l2=(l*2+r)/3,r2=(l+r*2)/3; if(calc(l2)<calc(r2))r=r2; else l=l2; } pair<int,int> best(calc(r),r); for(int i=l;i<=r;i++)best=min(best,{calc(i),i}); answer(best.second); } } cout << "YES\n"; for(int i=0;i<n;i++)cout << db(ans[i])/2.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...