P4186 [USACO18JAN] Cow at Large G
》》》dfs 先定义 再 写
》(dfs遇到叶节点,会自动返回)
》双向线路 会指向fa
》》》输入·时 反复检查
因为从叶节点dfs 会重复dfs节点
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<bits/stdc++.h> #define ll long long #define ddd printf("-----------------debug\n"); using namespace std; const int maxn=1e5+10; int n,k; int dep[maxn],head[maxn],to[maxn<<2],nxt[maxn<<2],cnt=0,de[maxn]; int ans=0; void add(int u,int v){ to[++cnt]=v; nxt[cnt]=head[u]; head[u]=cnt; } int dfs1(int x,int fa)//catch no gice up-> return min dep { dep[x]=dep[fa]+1; // de[x]=dep[x]; int is_lf=1; for(int i=head[x];i;i=nxt[i]) { int v=to[i]; if(v==fa) continue; de[x]=min(dfs1(v,x),de[x]); is_lf=0;//cause 2 ways // ddd } if(is_lf==1) return de[x]=dep[x];// else return de[x]; } void dfs2(int x,int fa) { if(de[x]<=dep[x]*2){//? ans++;return; // ddd } for(int i=head[x];i;i=nxt[i]) { int v=to[i]; if(v==fa) continue; dfs2(v,x); } } int main() { ios::sync_with_stdio(false); cin.tie(0); memset(de,0x3f3f3f3f,sizeof(de)); cin>>n>>k; //cout<<n<<k<<endl; for(int i=1;i<=n-1;i++) { int x,y; cin>>x>>y; // cout<<x<<y<<endl; add(x,y);add(y,x); } dep[k]=-1; de[k]=dfs1(k,k); dfs2(k,k); // ddd cout<<ans<<'\n'; return 0; }
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<bits/stdc++.h> #define ll long long #define ddd printf("-----------------debug\n"); using namespace std; const int maxn=1e5+10; int n,k; int dep[maxn],head[maxn],to[maxn<<2],nxt[maxn<<2],cnt=0,de[maxn]; int ans=0,du[maxn<<1]; queue<int> q; void add(int u,int v){ to[++cnt]=v; nxt[cnt]=head[u]; head[u]=cnt; } /* int dfs1(int x,int fa)//catch no gice up-> return min dep { dep[x]=dep[fa]+1; // de[x]=dep[x]; int is_lf=1; for(int i=head[x];i;i=nxt[i]) { int v=to[i]; if(v==fa) continue; de[x]=min(dfs1(v,x),de[x]); is_lf=0;//cause 2 ways // ddd } if(is_lf==1) return de[x]=dep[x];// else return de[x]; } */ void dfs1(int x,int fa) { dep[x]=dep[fa]+1; for(int i=head[x];i;i=nxt[i]) { int v=to[i]; if(v==fa) continue; dfs1(v,x); } } void dfs3(int x,int fa) { if(x==k) return; for(int i=head[x];i;i=nxt[i]) { int v=to[i]; if(v==fa) continue; de[v]=min(de[v],de[x]+1); dfs3(v,x); } } void dfs2(int x,int fa) { if(de[x]<=dep[x]){//? ans++;return; // ddd } for(int i=head[x];i;i=nxt[i]) { int v=to[i]; if(v==fa) continue; dfs2(v,x); } } int main() { ios::sync_with_stdio(false); cin.tie(0); memset(de,0x3f3f3f3f,sizeof(de)); cin>>n>>k; //cout<<n<<k<<endl; for(int i=1;i<=n-1;i++) { int x,y; cin>>x>>y; add(x,y);add(y,x); du[y]++,du[x]++; } for(int i=1;i<=n;i++) if(du[i]==1) q.push(i); dep[k]=-1; dfs1(k,k); while(!q.empty()) { int x=q.front();q.pop(); de[x]=0; dfs3(x,x); } dfs2(k,k); // ddd cout<<ans<<'\n'; return 0; }

浙公网安备 33010602011771号