HDU 5423 Rikka with Tree

来源:互联网 发布:大数据导论 pdf 编辑:程序博客网 时间:2024/06/06 12:45
/* DFSRikka with Tree时间: 2017/02/24题意:判断树是否存在跟他相似并不同的树题解: 要求相似并不同,树的结构必须除了最后一层,每层只能一个点最开始我用记忆化搜索去计算其长度,因为我觉得树都是已知指向未知,相当于DAG,但是一直wa。(困惑)后来用dfs计算长度过了*/  #include<cstdio>#include<cstring>#include<cmath>#include<iostream>#include<algorithm>#include<queue>#include<map>using namespace std;#define LL long long#define N 1010#define INF 0x3f3f3f3fint mp[N][N],dist[N],vis[N];int n;int DFS(int i){    if(dist[i] >= 0)        return dist[i];    for(int j = 1; j < n; j++)    {        if(mp[i][j] && dist[j] >= 0)            return dist[i] = 1+DFS(j);    }}void dfs(int u,int depth){    dist[u]=depth;    //printf("%d   %d\n",u,dist[u]);    for(int i = 1; i <= n; i++)    {        vis[u]=true;        if(mp[i][u] && !vis[i])        {            dfs(i,depth+1);            vis[u]=false;        }    }}int main(){    while(~scanf("%d",&n))    {        memset(mp,0,sizeof(mp));        int a,b;        for(int i = 1; i < n; i++)        {            scanf("%d%d",&a,&b);            mp[a][b] = mp[b][a] = 1;        }        int flag = 1;        memset(dist,-1,sizeof(dist));        memset(vis,0,sizeof(vis));        int mx = -1;        dfs(1,0);        for(int i = 1; i <= n; i++)        {            mx = max(mx,dist[i]);        }        for(int i = 2; i <= n; i++)        {            for(int j = i+1; j <= n; j++)                if(dist[i] == dist[j] && dist[i] != mx)                {                    flag = 0;                    break;                }            if(!flag)                break;        }        if(flag)            puts("YES");        else            puts("NO");    }    return 0;}


0 0
原创粉丝点击