实用排名次程序

#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;
#define maxn 1010
int n,m,a,b,ind=1,mm[maxn][maxn],len[maxn],d[maxn],cnt,sigma=15,que[maxn];


struct Trie
{
    int ch[maxn][31];
    int val[maxn];
    int sz;
    Trie()
    {
        sz=1;
        memset(ch[0],0,sizeof(ch[0]));
    }
    int idx(char c)
    {
        return c-'a';
    }

    void insert(char *s,int v)
    {
        int u=0,n=strlen(s);
        for(int i=0; i<n; i++)
        {
            int c=idx(s[i]);
            if(!ch[u][c])
            {
                memset(ch[sz],0,sizeof(ch[sz]));
                val[sz]=0;
                ch[u][c]=sz++;
            }
            u=ch[u][c];
        }
        val[u]=v;
    }
    int search(char *s)
    {
        int u=0,n=strlen(s);
        for(int i=0; i<n; i++)
        {
            int c=idx(s[i]);
            if(!ch[u][c])
                return 0;
            u=ch[u][c];
        }
        if(val[u])
            return val[u];
        return 0;
    }

}
t;

void bfs(int x)
{
    int he=1,ta=1;

    d[x]=1;
    que[he]=x;
    while(he<=ta)
    {
        int u=que[he];
        he++;
    //    printf("检查%d\n",u);
        for(int i=1; i<=cnt; i++)
        {
            if((mm[u][i])&&(d[i]<d[u]+mm[u][i]))
            {
                d[i]=d[u]+mm[u][i];
            //    printf("d[%d]由d[%d]更新为%d\n",i,u,d[i]);
                que[++ta]=i;
             //   printf("%d推进\n");

            }
        }
    }
}
int main()
{
    while(scanf("%d",&n)&&n)
    {
        int u,v;
        cnt=0;
        memset(mm,0,sizeof(mm));
        memset(len,0,sizeof(len));
        char s1[100],s2[100];
        for(int i=1; i<=n; i++)
        {
            scanf("%s%s",s1,s2);
            if(!t.search(s1))
                t.insert(s1,++cnt);
            if(!t.search(s2))
                t.insert(s2,++cnt);
            u=t.search(s1);
            v=t.search(s2);
            // printf("u==%d,v==%d\n",u,v);
            if(!mm[u][v])
            {
                mm[u][v]=1;
                len[v]++;
            }
        }//输入完
        int st=-1;
        for(int i=1; i<=cnt; i++)
        {
            // printf("%d的茶%d\n",i,len[i]);
            if(!len[i])
            {
                if(st==-1)
                    st=i;
                else
                {
                    printf("NO\n");
                    continue;
                }
            }
        }
        if(st==-1)
        {
            printf("NO\n");
            continue;
        }
        bfs(st);
        int cixu[maxn];
        memset(cixu,0,sizeof(cixu));
        for(int i=1; i<=cnt; i++)
        {
           // printf("d[%d]=%d,cixu=%d\n",i,d[i],cixu[d[i]]);
            if((!d[i])||(cixu[d[i]]))

            {
                printf("NO\n");
                continue;
            }
            cixu[d[i]]=1;

        }
        printf("YES\n");
    }
}

搞得这么复杂,还超时了

就输出个YESNO就行了

我顺便把名次也给输出了233

名字真该用map和string,trie不好找

HDU2094

话说我好喜欢实用

猜你喜欢

转载自blog.csdn.net/qq_43439240/article/details/85556802