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
  • 相关阅读:
    链表的逆置(无聊而写)
    C
    大型分布式站点的技术需求
    leetcode第一刷_Best Time to Buy and Sell Stock
    微商行业面临洗礼,微盟萌店是否能完毕“神补刀”?
    oracle函数 CONCAT(c1,c2)
    oracle函数 CHR(n1)
    oracle函数 ASCII(x1)
    oracle函数 INTERVAL c1 set1
    oracle函数 SESSIONTIMEZONE
  • 原文地址:https://www.cnblogs.com/wangfang20/p/3190937.html
Copyright © 2011-2022 走看看