zoukankan      html  css  js  c++  java
  • joj 1089 &&zoj 1060&&poj 1094 以及wa的分析和数据

    这道题着实让无数人纠结,wa了n次n天,poj的discuss有大量的数据,wa的同学可以试一试。

    结果我把数据都过了还是wa,后来在discuss的帮助下终于ac了,判断是否有环要最先判断,例如如下的数据:

    4 4

    A<B

    C<B

    D<B

    B<A

    总的思想是拓扑排序,我的方法比较笨,先不完全拓扑排序判断有无环,在完全拓扑排序判断是否满足了条件:

    #include<iostream>
    #include<stdio.h>
    #include<queue>
    using namespace std;
    int map[27][27];
    int rudu[27];
    int r_mark[27];
    int fff;  //一个分量中如度为0的点的个数
    int chu;  //一个分量中入度为零得点
    int dfs(int m)
    {
        int i;
       
        if(r_mark[m]==1)
            return 0;
        else
            r_mark[m]=1;
        if(rudu[m]==0)
        {
            fff++;
            chu=m;
        }
        int k=0;
        for(i=0;i<27;i++)
           if((map[i][m]||map[m][i])&&r_mark[i]==0)
              k+=dfs(i);
        return k+1;
    }
    int main()
    {
        int m,n;
        //freopen("out","w",stdout);
        while(scanf("%d%d",&m,&n),m||n)
        {
            int i,j;
            memset(map,0,sizeof(map));
            memset(rudu,0,sizeof(rudu));
            int rrr=0;
            for(i=0;i<n;i++)
            {
                char str[10];
                scanf("%s",str);
                if(map[str[0]-'A'][str[2]-'A']==1)
                     continue;
                map[str[0]-'A'][str[2]-'A']=1;
                rudu[str[2]-'A']++;
                int sum=0,k;
                if(rrr)
                   continue;
                for(j=0;j<m;j++)
                {
                    if(rudu[j]==0)
                    {
                       sum++;
                       k=j;
                    }
                }
                if(sum==0)
                {
                   printf("Inconsistency found after %d relations.\n",i+1);
                   rrr=1;
                   continue;
                }
                int ww_rudu[27];                  //不完全拓扑排序证明无环
                    for(j=0;j<27;j++)
                        ww_rudu[j]=rudu[j];
                j=0;
                while(ww_rudu[j]!=0)
                   j++;
                k=j;
                int count=0;
                while(1)
                {
                     count++;
                     ww_rudu[k]=-1;
                     for(j=0;j<m;j++)
                     {
                            if(map[k][j])
                            {
                                 ww_rudu[j]--;
                            }
                     }
                     j=0;
                     while(ww_rudu[j]!=0&&j<m)
                         j++;
                     k=j;
                     if(j==m)
                         break;
                }
                if(count<m)
                {
                   printf("Inconsistency found after %d relations.\n",i+1);
                   rrr=1;
                   continue;
                }
                int jj;
                memset(r_mark,0,sizeof(r_mark));
                for(jj=0;jj<m;jj++)
                {
                    if(r_mark[jj]==1)
                        continue;
                    fff=0;
                    queue<int> q;
                    int mm=dfs(jj);
                    if(mm==1)
                        continue;
                    if(fff==0)
                    {
                        printf("Inconsistency found after %d relations.\n",i+1);
                        rrr=1;
                        break;
                    }
                    int cc=0;
                    int mark=0;
                    int w_rudu[27];
                    for(j=0;j<27;j++)
                        w_rudu[j]=rudu[j];
                    int k=chu;
                    q.push(k);
                    int wa=0;
                    if(fff==1&&mm==m)     //完全拓扑排序求解最终问题
                    while(1)
                    {
                        cc++;
                        //cout<<"aaaaaa"<<endl;
                        int sum=0,kk;
                        for(j=0;j<m;j++)
                        {
                           if(map[k][j])
                           {
                               w_rudu[j]--;
                               if(w_rudu[j]==0)
                               {
                                    sum++;
                                    kk=j;
                               }
                           }
                        }
                        if(sum==1)
                        {
                            k=kk;
                            q.push(k);
                        }
                        else
                            break;
                    }
                    // cout<<mark<<" "<<cc<<" "<<mm<<" "<<fff<<endl;
                    if(cc==m&&wa==0)
                    {
                        printf("Sorted sequence determined after %d relations: ",i+1);
                        while(!q.empty())
                        {
                            printf("%c",q.front()+'A');
                            q.pop();
                        }
                        printf(".\n");
                        rrr=1;
                    }
                }
            }
            if(rrr==0)
            {
                printf("Sorted sequence cannot be determined.\n");
            }
        }
    }

  • 相关阅读:
    康拓展开
    P6032 选择客栈 加强版 递推
    0923考试T3 二进制,位运算
    0922考试T3 dfs序 lca 线段树 树上问题
    0921考试T2
    0922考试T1
    P3934 [Ynoi2016]炸脖龙I 树状数组 扩展欧拉定理
    0922考试T4 区间DP
    P6834 [Cnoi2020]梦原 树状数组 期望DP
    UVA1364 Knights of the Round Table Tarjan求点双联通分量+二分图染色
  • 原文地址:https://www.cnblogs.com/dchipnau/p/4985936.html
Copyright © 2011-2022 走看看