【C++心路历程27】变量排序

来源:互联网 发布:手机淘宝店铺首页设置 编辑:程序博客网 时间:2024/06/13 23:39

变量排序

【问题描述】

  把不同的变量进行升序排序用小于操作符命令实现的。例如由A < B, B < C 和 C < D 可以得到升序序列A, B, C, D 。

  在本题中,你将得到若干条小于操作符命令,形如 A < B 的格式,请你确定利用这些命令,能否得到一个唯一的升序序列。

【输入格式】

  第1行为整数n,m,n(2 <= n <= 26)表示参与排序的是前n个大写字母,m表示给出命令的条数。

【输出格式】

  输出一行:
  如果根据输入能得到唯一的升序序列,则输出“Sorted sequence determined after xxx relations: yyy…y. ”
  如果不能得到唯一的升序序列,则输出“Sorted sequence cannot be determined. ”
  如果不能得到升序序列,则输出“Inconsistency found after xxx relations. ”
  上面的信息中 xxx 是一个整数,是表示至多根据前xxx条信息就可以得出该结论。 yyy…y表示得到的升序序列的大写字母串。

【输入样例】

【样例1】
 4 6
 A < B
 A < C
 B < C
 C < D
 B < D
 A < B

【样例2】
 3 2
 A < B
 B < A

【样例3】
 26 1
 A < Z

【输出样例】

【样例1】
 Sorted sequence determined after 4 relations: ABCD.

【样例2】
 Inconsistency found after 2 relations.

【样例3】
 Sorted sequence cannot be determined.
【分析】
这道题虽然给了一堆条件,却让我们判断前i个是否可行,于是判断时我们也只需要用前i个条件。在输入时判断即可。
【输入框架】

void init(){    scanf("%d%d%c",&n,&m,&yy);//用前n个字母给出信息     int ok=1;     for(int i=1;i<=m;i++)    {        gets(w[i]);        if(check(i)!=2)         {            ok=0;break;        }    }    if(ok)    {        printf("Sorted sequence cannot be determined.");    }}

而具体到如何检查,即check函数,我们可以由题给条件想到DAG图(排序很特殊)与拓扑序列。其要判断的 唯一性/是否存在性 也与拓扑排序相符。注意判断的几个条件在题中比较关键。
完整代码:

#include<cstdio>#include<iostream>#include<cstring>#include<cmath>#include<algorithm>#include<queue>#include<vector>using namespace std;const int maxn=10005;int n,m,first[maxn],x,y,np=0,hash[30][30],mark[30],rd[30],t[30];int cnt=1;char w[maxn][30],yy;vector<int>topo;struct edge{    int to,next;}E[maxn<<1];void addedge(int u,int v){    E[++np]=(edge){v,first[u]};    first[u]=np;}int check(int rr){    int cnt=0;    for(int i=1;i<=n;i++)    {        if(mark[i]) cnt++;    }    //找有效点个数     topo.clear();    int ret=1;    queue<int>q;    for(int i=1;i<=n;i++)    {        if(mark[i]&&(t[i]==0))        {            q.push(i);topo.push_back(i);        }    }    while(!q.empty())    {        if(q.size()>1)         {            ret=2;//有可能有多条          }        int i=q.front();q.pop();        for(int p=first[i];p;p=E[p].next)        {            int j=E[p].to;            if(t[j]) t[j]--;            if(t[j]==0)             {            q.push(j);topo.push_back(j);            }        }    }    if(topo.size()<cnt) //出现了环     {        printf("Inconsistency found after %d relations.",rr);        return ret=0;    }    if(ret==2) return ret;//如果有多条直接return 即当前条件不足以判断      if(topo.size()==n)//符合条件     {        printf("Sorted sequence determined after %d relations: ",rr);//输出        for(int i=n-1;i>=0;i--)        {            printf("%c",topo[i]+64);        }        printf(".");        return ret=1;    }     if(topo.size()<n) return ret=2;//补充条件:如果是唯一的 但是却没有达到n个  }void init(){    scanf("%d%d%c",&n,&m,&yy);//用前n个字母给出信息     int ok=1;     for(int i=1;i<=m;i++)    {        gets(w[i]);        int v=w[i][0]-64,u=w[i][2]-64;        if(!hash[u][v])        {            hash[u][v]=1;            mark[u]=mark[v]=1;            addedge(u,v);            rd[v]++;        }        memcpy(t,rd,sizeof(t));        if(check(i)!=2)         {            ok=0;break;        }    }    if(ok)    {        printf("Sorted sequence cannot be determined.");    }}int main(){//  freopen("in.txt","r",stdin);    init();     return 0;}
原创粉丝点击