读书人

poj3342实在不知道哪里错了

发布时间: 2012-09-14 11:53:44 作者: rapoo

poj3342实在不知道错哪了。

C/C++ code
#include<iostream>#include<cstdio>#include<string>#include<string.h>#include<algorithm>using namespace std;int dp[201][2];//以i号节点为根的树所能选的最大节点数:dp[i][]// 不选i号节点:dp[i][0]=sum(max(dp[son[i][j]][1],dp[son[i][j]][0]));选i号节点:dp[i][1]=sum(dp[son[i][j]][0])+1;//  初始化:dp[叶子][0]=0;  dp[叶子][1]=1; 由叶向根树形dpint son[201][201],deep[201];void bfs(int node,int T,int d){    deep[node]=d;    for(int i=0;i<T;i++)    {        if(son[node][i]==1)        bfs(i,T,d+1);    }}int main(){    int i,j,k;    int T,tmp1,tmp2;    while(scanf("%d",&T)&&T)    {        j=1;        string str[201];        memset(son,0,sizeof(son));  memset(deep,0,sizeof(deep));        cin>>str[0];        string s1,s2;        for(i=0;i<T-1;i++)        {            tmp1=tmp2=-1;            int flag=0;            cin>>s1>>s2;            for(k=0;k<j;k++)//对于输入的字符串进行处理            {                if(s1==str[k])                { tmp1=k; flag=2; if(tmp2!=-1)  {flag=0; break;} continue; }                if(s2==str[k])                { tmp2=k; flag=1; if(tmp1!=-1)  {flag=0; break;} continue; }            }            if(k==j&&flag==1)//s2找到了匹配串,s1没有找到            { str[j++]=s1; son[tmp2][j-1]=1;}            else if(k==j&&flag==2)//s1找到了匹配串  ,s2没有找到            { str[j++]=s2; son[j-1][tmp1]=1;}            else if(k!=j&&flag==0)//s1 s2都找到了匹配串            { son[tmp2][tmp1]=1;  }            else if(k==j&&flag==0)//s1  s2都未找到匹配串            {                tmp1=j;  str[j++]=s1;                tmp2=j;  str[j++]=s2;                son[tmp2][tmp1]=1;            }        }        bfs(0,T,0);//计算每个节点所在树的深度,boss节点为0层        int MAX=-1;        for(i=0;i<T;i++)        { MAX=max(MAX,deep[i]); }//MAX记录最大深度,即叶子        for(i=0;i<T;i++)//在son中转存儿子的形式,son[i][0] i号节点有几个儿子        {            son[i][0]=0;            for(j=1,k=1;j<T;j++)            if(son[i][j]==1)            {                son[i][0]++;  son[i][k++]=j;            }        }        memset(dp,0,sizeof(dp));        for(i=0;i<T;i++)//初始化        {            if(deep[i]==MAX)            dp[i][1]=1;        }        for(i=MAX-1;i>=0;i--)//由叶向根dp        {            for(j=0;j<T;j++)            {                if(deep[j]==i)                {                    for(k=1;k<=son[j][0];k++)                    {  dp[j][0]+=(max(dp[son[j][k]][1],dp[son[j][k]][0]));    dp[j][1]+=dp[son[j][k]][0];  }                    dp[j][1]++;                }            }        }        if(dp[0][1]==dp[0][0])  { printf("%d No\n",dp[0][0]); continue;}        MAX=max(dp[0][0],dp[0][1]);//检验是否唯一        for(i=1;i<T;i++)        {            if(MAX==dp[i][1]||MAX==dp[i][0])            break;        }        if(i==T)        printf("%d Yes\n",MAX);        else        printf("%d No\n",MAX);    }    return 0;}


[解决办法]
好吧!!那我来接分把。。。。。
[解决办法]
O(∩_∩)O哈哈~

读书人网 >软件架构设计

热点推荐