如何把n个点n-1条边转换为1棵树

来源:互联网 发布:20式82毫米迫击炮数据 编辑:程序博客网 时间:2024/06/05 14:15

边的数据结构:

class edge{public:    int v,u;    int next;    edge(){v=0;u=0;next=-1;}//next一定要初始化为-1哦};

读入边的要求

#include <iostream>#include <cstdio>#include <cstring>#define maxn 1000using namespace std;void add(int u,int v,int &len);class edge{public:    int v,u;    int next;    edge(){v=0;u=0;next=-1;}//next一定要初始化为-1哦};void dfs(int root,int depth);edge e[maxn*2];//一千个点就有n-1条边,每条边都是无向的所以一共就有2n-2条边int head[maxn];int dep[maxn];bool vis[maxn];int main(){    int n;    scanf("%d",&n);//一共n个点    int len(0);    memset(head,-1,sizeof(head));    memset(dep,0,sizeof(dep));    for (int k=0;k<n-1;k++)    {        int u,v;        scanf("%d %d",&u,&v);        add(u,v,len);    }//现在的话树结构已经建立起来了任意一个节点都是可以当做父节点的   // for (int k=head[1];k!=-1;k=e[k].next)     //   cout<<e[k].v<<" ";    memset(vis,0,sizeof(vis));//不管做什么操作前一定要开vis数组否则会出现死循环    dfs(1,1);    for (int k=1;k<=n;k++)        cout<<dep[k]<<" ";    cout<<endl;    return 0;}void dfs(int root,int depth){    vis[root]=1;    dep[root]=depth;    for (int k=head[root];k!=-1;k=e[k].next)        if (!vis[e[k].v])    dfs(e[k].v,depth+1);    return;}void add(int u,int v,int &len)//就是有两种情况嘛,u为父节点还是v为父节点所以两种情况都要考虑到{    e[len].u=u;e[len].v=v;//head【u】就是以u为父节点的子节点的头结点                          //这些操作就是将这条边插到子节点的前面去    e[len].next=head[u];head[u]=len;    len++;    u=u^v;v=u^v;u=u^v;    e[len].v=v;e[len].u=u;    e[len].next=head[u];head[u]=len;    len++;    return;}

0 0
原创粉丝点击