zoukankan      html  css  js  c++  java
  • poj 1094 拓扑排序

    这题就是朴素的拓扑排序,只是一开始题意没看清楚,不太清楚几种结果的优先级。

    优先级其实就是给的测试数据的结果。

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<queue>
    #define Maxn 102
    #define Maxm 10010
    using namespace std;
    int graphic[Maxn][Maxn],indegree[Maxn],n,m,e;
    char ans[Maxn];
    int Topsort()
    {
        int i,j,k,num,temp,f=0;
        temp=0;
        for(i=1;i<=n;i++)
        {
            num=0;
            for(j=1;j<=n;j++)
            {
                if(indegree[j]==0)
                    num++;
            }
            if(num>1)
                f=1;
            for(j=1;j<=n;j++)
            {
                if(indegree[j]==0)
                {
                    indegree[j]--;
                    ans[e++]=j+'A'-1;
                    for(k=1;k<=n;k++)
                    {
                        if(graphic[j][k])
                            indegree[k]--;
                    }
                    temp++;
                    break;
                }
            }
        }
        //cout<<"*"<<temp<<endl;
        if(temp<n)
            return -1;
        if(f)
            return 0;
        return 1;
    }
    int main()
    {
        int i,j,a,b;
        char str[Maxm][10];
        //freopen("ans.txt","w",stdout);
        while(scanf("%d%d",&n,&m)!=EOF,n||m)
        {
            memset(graphic,0,sizeof(graphic));
            memset(indegree,0,sizeof(indegree));
            e=0;
            int temp,pos;
            for(i=0;i<m;i++)
            {
                scanf("%s",&str[i]);
                memset(indegree,0,sizeof(indegree));
                memset(graphic,0,sizeof(graphic));
                for(j=0;j<=i;j++)
                {
                    if(!graphic[str[j][0]-'A'+1][str[j][2]-'A'+1])
                    {
                    indegree[str[j][2]-'A'+1]++;
                    graphic[str[j][0]-'A'+1][str[j][2]-'A'+1]=1;
                    }
                }
                e=0;
                temp=Topsort();
                if(temp==1)
                {  //cout<<e<<endl;
                    pos=i+1;
                    ans[e]='';
                    break;
                }
                if(temp==-1)
                {
                    pos=i+1;
                    break;
                }
            }
            //cout<<i<<"&&"<<endl;
            for(i++;i<m;i++)
            {
                scanf("%s",&str[i]);
                //cout<<i<<endl;
            }//cout<<temp<<" **"<<endl;
            if(temp==-1)
            {
                printf("Inconsistency found after %d relations.
    ",pos);
            }
            if(temp==1)
            {
                printf("Sorted sequence determined after %d relations: %s.
    ",pos,ans);
            }
            if(temp==0)
                printf("Sorted sequence cannot be determined.
    ");
        }
        return 0;
    }

     给个邻接表的拓扑,果断0ms:

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<queue>
    #define Maxn 102
    #define Maxm 10010
    using namespace std;
    struct Edge{
        int to,next;
    }edge[Maxm];
    int graphic[Maxn][Maxn],indegree[Maxn],n,m,e,index[Maxn],r;
    char ans[Maxn];
    int Topsort()
    {
        int i,j,k,num,temp,f=0;
        temp=0;
        for(i=1;i<=n;i++)
        {
            num=0;
            for(j=1;j<=n;j++)
            {
                if(indegree[j]==0)
                    num++;
            }
            if(num>1)
                f=1;
            for(j=1;j<=n;j++)
            {
                if(indegree[j]==0)
                {
                    indegree[j]--;
                    ans[e++]=j+'A'-1;
                    for(k=index[j];k!=-1;k=edge[k].next)
                    {
                        indegree[edge[k].to]--;
                    }
                    temp++;
                    break;
                }
            }
        }
        //cout<<"*"<<temp<<endl;
        if(temp<n)
            return -1;
        if(f)
            return 0;
        return 1;
    }
    void addedge(int from ,int to)
    {
        edge[r].to=to;
        edge[r].next=index[from];
        index[from]=r++;
    }
    int main()
    {
        int i,j,a,b;
        char str[Maxm][10];
        //freopen("ans.txt","w",stdout);
        while(scanf("%d%d",&n,&m)!=EOF,n||m)
        {
            memset(graphic,0,sizeof(graphic));
            memset(indegree,0,sizeof(indegree));
            memset(index,-1,sizeof(index));
            e=0;
            int temp,pos;
            for(i=0;i<m;i++)
            {
                scanf("%s",&str[i]);
                memset(indegree,0,sizeof(indegree));
                memset(graphic,0,sizeof(graphic));
                memset(index,-1,sizeof(index));
                r=0;
                for(j=0;j<=i;j++)
                {
                    if(!graphic[str[j][0]-'A'+1][str[j][2]-'A'+1])
                    {
                    addedge(str[j][0]-'A'+1,str[j][2]-'A'+1);
                    indegree[str[j][2]-'A'+1]++;
                    graphic[str[j][0]-'A'+1][str[j][2]-'A'+1]=1;
                    }
                }
                e=0;
                temp=Topsort();
                if(temp==1)
                {  //cout<<e<<endl;
                    pos=i+1;
                    ans[e]='';
                    break;
                }
                if(temp==-1)
                {
                    pos=i+1;
                    break;
                }
            }
            //cout<<i<<"&&"<<endl;
            for(i++;i<m;i++)
            {
                scanf("%s",&str[i]);
                //cout<<i<<endl;
            }//cout<<temp<<" **"<<endl;
            if(temp==-1)
            {
                printf("Inconsistency found after %d relations.
    ",pos);
            }
            if(temp==1)
            {
                printf("Sorted sequence determined after %d relations: %s.
    ",pos,ans);
            }
            if(temp==0)
                printf("Sorted sequence cannot be determined.
    ");
        }
        return 0;
    }
    View Code
  • 相关阅读:
    383. Ransom Note
    598. Range Addition II
    453. Minimum Moves to Equal Array Elements
    492. Construct the Rectangle
    171. Excel Sheet Column Number
    697. Degree of an Array
    665. Nondecreasing Array
    视频网站使用H265编码能提高视频清晰度吗?
    现阶段的语音视频通话SDK需要解决哪些问题?
    企业远程高清会议平台视频会议系统在手机端使用的必备要求有哪些?
  • 原文地址:https://www.cnblogs.com/wangfang20/p/3190937.html
Copyright © 2011-2022 走看看