POJ--2567--Code the Tree

来源:互联网 发布:java 不用tomcat 编辑:程序博客网 时间:2024/06/05 18:56

直接 模拟,然后,每次找到编号最小的一个点的父亲输出就可以了。

注意格式,输入输出就OK 了

#include<iostream>#include<cstring>#include<cstdio>#include<vector>#include<algorithm>#define maxn 10000using namespace std;char s[maxn];vector<int> g[51];int n;void init(){    for(int i=0;i<=50;i++)    g[i].clear();}void build(int v,int l,int r){    char c;    int u=0;    int tr=0;    l++;r--;    int li,ri;    while(l<=r)    {        if(s[l]>='0'&&s[l]<='9')        {            u=u*10+s[l]-'0';        }        else if(s[l]=='(')        {            break;        }        l++;    }    if(u>n)n=u;    if(v!=-1)    {        g[u].push_back(v);        g[v].push_back(u);    }    tr=0;    for(int i=l;i<=r;i++)    {        if(s[i]=='(')        {            if(tr==0)li=i;            tr++;        }        else if(s[i]==')')        {            tr--;            if(tr==0)            {                build(u,li,i);            }        }    }}bool vis[102];void op(int num){    int fa=g[num][0];    g[fa].erase(find(g[fa].begin(),g[fa].end(),num));    vis[num]=1;    printf("%d",fa);}void solve(){    int len=strlen(s);    n=0;    build(-1,0,len-2);    memset(vis,0,sizeof(vis));    bool single_node=true;    for(int i=1;i<n;i++)    {        single_node=false;        int temp=10000;        for(int j=1;j<=n;j++)        {            if(!vis[j])            {                if(g[j].size()==1&&j<temp)                {                    temp=j;                }            }        }        op(temp);        if(i==n-1)printf("\n");        else printf(" ");    }    if(single_node)printf("\n");}int main(){    while(fgets(s,maxn,stdin))    {        init();        solve();    }    return 0;}


原创粉丝点击