试图写非递归求解,然后TLE了一下午==,全程找不到bug,换成递归,一发AC
判断环写得很丑==
#include<bits/stdc++.h> using namespace std; typedef long long ll; #define P pair<int,int> vector<P> G[100005]; bool vis[100005]; int n; int fa[100005]; int x[100004]; bool s[100005]; bool fx[100005]; int in=-1; int T=0; int a; bool dfs(int x) { T++; // if(vis[x])return false; //if(++T>100000)puts(0); for(int i=0; i<G[x].size(); i++) { a=G[x][i].first; //if(G[a].size()==1)continue; if((a!=fa[x])&&(!vis[a])) { fa[a]=x; vis[a]=1; if(dfs(a)) { return true; } } else if((a!=fa[x])&&vis[a]) { fa[a]=x; in=a; return true; } } return false; } void solve(int k) { fx[k]=1; int n=G[k].size(); for(int i=0;i<n;i++){ int a=G[k][i].first; int b=G[k][i].second; x[a]=b-x[k]; if(!fx[a]) solve(a); } } int main() { scanf("%d",&n); int a,b,c; int R=1; for(int i=0; i<n; i++) { scanf("%d%d%d",&a,&b,&c); G[a].push_back(P(b,c)); G[b].push_back(P(a,c)); if(G[a].size()>G[R].size())R=a; if(G[b].size()>G[R].size())R=b; } vis[R]=1; dfs(R); int t=in; int g=1,dd=0; int ans=0; while((!dd)||t!=in) { dd=1; for(int i=0; i<G[t].size(); i++) { if(G[t][i].first==fa[t]) { ans+=g*G[t][i].second; g*=-1; t=fa[t]; break; } } } x[in]=ans/2; fx[in]=1; solve(in); /*while(true) { /*if(T+10>=100000){ puts(0); } bool wa=0; /*for(int i=1; i<=n; i++) { if(!fx[i]) { wa=1; break; } } if(!wa)break; if(t==-1) { for(int i=1; i<=n; i++) { if(fx[i]&&!(s[i])) { t=i; break; } } if(t==-1)break; } k=t; t=-1; for(int i=0; i<G[k].size(); i++) { int l=G[k][i].first; int r=G[k][i].second; x[l]=r-x[k]; fx[l]=1; if(!s[l]&&t==-1)t=l; } s[k]=1; } */ for(int i=1; i<=n; i++) { cout<<x[i]<<‘\n‘; } }
原文:https://www.cnblogs.com/liulex/p/11228255.html