제출 #802466

#제출 시각아이디문제언어결과실행 시간메모리
802466amirhoseinfar1385Graph (BOI20_graph)C++17
0 / 100
3 ms5024 KiB
#include<bits/stdc++.h> using namespace std; const int maxn=100000+10,lg=20; vector<pair<int,int>>adj[maxn],adjt[maxn]; int isr[maxn],vis[maxn],n,m,high[maxn],resf[maxn],resz[maxn],val[maxn]; int res=1,timea=0; vector<int>now; void dfs(int u){ if(vis[u]==1){ return ; } now.push_back(u); isr[u]=1; vis[u]=1; for(auto xx:adj[u]){ int x=xx.first; int y=xx.second; if(vis[x]==0){ adjt[u].push_back(xx); adjt[x].push_back(make_pair(u,xx.second)); high[x]=high[u]+1; if(high[u]&1){ resf[x]=resf[u]; resz[x]=resz[u]+y; } else{ resf[x]=resf[u]+y; resz[x]=resz[u]; } dfs(x); } } } pair<int,int> checkalle(){ for(auto x:now){ for(auto xx:adj[x]){ int y=xx.first; if(high[x]<high[y]){ continue; } if(high[x]==high[y]+1){ continue; } int sf=resf[x]-resf[y],sz=resz[x]-resz[y]; if(high[x]&1){ sf+=xx.second; } else{ sz+=xx.second; } if(sz==sf){ continue; } if((high[x]&1)!=(high[y]&1)){ return make_pair(-2,-2); } int ss; if(high[x]&1){ ss=sf-sz; } else{ ss=sz-sf; } ss/=2; //cout<<x<<" "<<ss<<" "<<sz<<" "<<sf<<"wtf\n"; return make_pair(x,ss); } } return make_pair(-1,-1); } long long por(int u,int w,int par=0){ //cout<<u<<" "<<w<<" "<<par<<" asd\n"; val[u]=w; long long ret=abs(w); for(auto x:adjt[u]){ if(x.first!=par){ ret+=por(x.first,x.second-w,u); } } return ret; } void solve(int u){ now.clear(); dfs(u); pair<int,int>fixy=checkalle(); if(fixy.first==-2){ res=0; return ; } //cout<<u<<" "<<endl; if(fixy.first!=-1){ por(fixy.first,fixy.second); return ; } long long mina=1e17,w=0; for(int i=-1000;i<1000;i++){ long long z=por(u,i); if(z<mina){ mina=z; w=i; } } //cout<<por(u,0)<<" "<<por(u,2)<<" "<<mina<<" "<<w<<"\n"; por(u,w); } void checkakh(){ for(int i=1;i<=n;i++){ for(auto x:adj[i]){ int y=x.first; //cout<<val[i]<<" "<<val[y]<<" "<<x.second<<"\n"; if(val[i]+val[y]!=x.second){ res=0; return ; } } } } int main(){ ios::sync_with_stdio(0); cin.tie(0); //cout.tie(0); cin>>n>>m; for(int i=0;i<m;i++){ int u,v,w; cin>>u>>v>>w; w*=2; adj[u].push_back(make_pair(v,w)); adj[v].push_back(make_pair(u,w)); } for(int i=1;i<=n;i++){ if(isr[i]==0){ //cout<<"ha: "<<i<<"\n"; solve(i); } } ////cout<<res<<"\n"; checkakh(); if(res==0){ cout<<"NO\n"; return 0; } cout<<"YES\n"; cout<<setprecision(2); for(int i=1;i<=n;i++){ double co=val[i]; co/=2; cout<<co<<" "; } cout<<"\n"; }
#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...