제출 #83605

#제출 시각아이디문제언어결과실행 시간메모리
83605Bodo171Pipes (BOI13_pipes)C++14
74.07 / 100
109 ms11844 KiB
#include <iostream> #include <fstream> #include <vector> using namespace std; const int nmax=100005; vector< pair<int,int> > v[nmax]; pair<int,int> cyc[nmax]; int rep[nmax],wh[nmax],mu[nmax],viz[nmax],ans[nmax],vreau[nmax],am[nmax]; int n,nr,m,i,j,sz,x,y,act,a,b; void solve(int x) { int nod=0; viz[x]=1; for(int i=0;i<v[x].size();i++) if(!viz[v[x][i].first]) { nod=v[x][i].first; solve(nod); ans[v[x][i].second]=vreau[nod]-am[nod]; am[x]+=(vreau[nod]-am[nod]); } } int it=0; bool gasit; void dfs(int x) { rep[++nr]=x;wh[x]=nr; for(int i=0;i<v[x].size()&&(!gasit);i++) { mu[nr]=v[x][i].second; if(!wh[v[x][i].first]) { dfs(v[x][i].first); } else { if(wh[v[x][i].first]!=nr-1) { gasit=1; for(j=wh[v[x][i].first];j<=nr;j++) { cyc[++sz]={rep[j],mu[j]}; } } } } nr--; } void gaseste_ciclu() { dfs(1); for(i=1;i<=sz;i++) viz[cyc[i].first]=1; if(!(sz%2)) { cout<<"0"; return; } for(i=1;i<=sz;i++) { x=cyc[i].first; dfs(x); vreau[x]-=am[x]; } for(i=1;i<=sz;i++) { x=cyc[i].first; if((i&1)) act+=vreau[x]; else act-=vreau[x]; } if(act%2) { cout<<"0"; return; } ans[cyc[sz].second]=act/2; cyc[0]=cyc[sz]; for(i=1;i<sz;i++) { ans[cyc[i].second]=vreau[cyc[i].first]-ans[cyc[i-1].second]; } for(i=1;i<=m;i++) cout<<2*ans[i]<<'\n'; } int main() { // freopen("data.in","r",stdin); ios_base::sync_with_stdio(false); cin>>n>>m; if(m>n) { cout<<"0"; return 0; } for(i=1;i<=n;i++) { cin>>vreau[i]; } for(i=1;i<=m;i++) { cin>>a>>b; v[a].push_back({b,i}); v[b].push_back({a,i}); } if(m==n-1) { solve(1); if(vreau[1]-am[1]) { cout<<"0"; return 0; } for(i=1;i<=m;i++) cout<<2*ans[i]<<'\n'; } else { gaseste_ciclu(); } return 0; }

컴파일 시 표준 에러 (stderr) 메시지

pipes.cpp: In function 'void solve(int)':
pipes.cpp:14:18: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for(int i=0;i<v[x].size();i++)
                 ~^~~~~~~~~~~~
pipes.cpp: In function 'void dfs(int)':
pipes.cpp:28:18: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for(int i=0;i<v[x].size()&&(!gasit);i++)
                 ~^~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...