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;
}
AC
#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;
}
58 TLE

 

 
 
 
 
 
posted @ 2023-07-27 17:29  JMXZ  阅读(8)  评论(0)    收藏  举报