zoukankan      html  css  js  c++  java
  • HLG 2025

    确定大小
    Time Limit: 1000 MS Memory Limit: 32768 K
    Total Submit: 50(15 users) Total Accepted: 12(11 users) Rating: Special Judge: No
    Description
    现在有N个字母,(N <= 26),我们称之为A、B、C、D......。这次他们之间想确定大小关系。
    但是现在只有一些残缺不全的关系,比如A > Z,然后没了......

    现在给出N个字母,(前N个大写字母),然后给出M个关系,每个关系只有大于和小于两种。

    最后判断那些是可以确定他应有的大小位置的。

    (没有给出的关系,均属于不可确定)

    Input
    多组测试数据:每组测试数据:
    第一行两个整数N,M。
    接下来M行,每行一个关系,形式如:A>B A<B
    (M < 30)
    Output
    按照ABCD...的顺序,输出可以确定的势力和他的排名。
    如果都不可以确定,则输出-1。
    Sample Input
    3 2
    A>B
    B>C
    3 3
    A>B
    B>C
    C>A
    Sample Output
    A 1
    B 2
    C 3
    -1

    Source

     本题要求输出可以确定的人的排名2,首先需要建两个图,正向建一个反向建一个。

    由于是有向图,对两个图中的每一个点进行bfs,记录以他为起始点所能扩展的点的数量

    我的程序中用head和tail数组进行存储的。对于每个点,如何head值和tail值加起来的和为n-1

    那么这个点的名次就是可以确定的了,

    他的名次其实就是tail的值+1

    还有一个问题就是结构体edge大小的问题
    ,我刚开始开的maxn,结果wa了,他的大小应该为2*maxn

    #include<stdio.h>
    #include<iostream>
    #include<queue>
    #include<string.h>
    #include<algorithm>
    using namespace std;
    const int maxn=50;
    int head[maxn],tail[maxn];
    int  vis[maxn];
    struct Edge{
      int to;
      int next;
    }edge1[maxn*4],edge2[maxn*4];
    int head1[maxn];
    int head2[maxn];
    int tot1,tot2;
    int n,q;
    void addedge(int u,int v){
            edge1[tot1].to=v;
            edge1[tot1].next=head1[u];
            head1[u]=tot1++;
             edge2[tot2].to=u;
            edge2[tot2].next=head2[v];
            head2[v]=tot2++;
    }
    int head_num,tail_num;
    void  head_bfs(int u){
      for(int i=1;i<=n;i++)
        vis[i]=0;
        vis[u]=1;
        queue<int>q;
        q.push(u);
         int v;
        while(!q.empty()){
                v=q.front();
                q.pop();
        for(int i=head1[v];i!=-1;i=edge1[i].next){
            if(!vis[edge1[i].to]){
                    vis[edge1[i].to]=1;
                q.push(edge1[i].to);
                head_num++;
            }
        }
        }
    }
    void  tail_bfs(int u){
         for(int i=1;i<=n;i++)
        vis[i]=0;
        vis[u]=1;
        queue<int>q;
        q.push(u);
        int v;
        while(!q.empty()){
                 v=q.front();
                q.pop();
        for(int i=head2[v];i!=-1;i=edge2[i].next){
            if(!vis[edge2[i].to]){
                    vis[edge2[i].to]=1;
                q.push(edge2[i].to);
                tail_num++;
            }
        }
        }
    }
    void init(){
        tot1=0;
        tot2=0;
       memset(head1,-1,sizeof(head1));
       memset(head2,-1,sizeof(head2));
    }
    int main(){
    
        while(scanf("%d%d",&n,&q)!=EOF){
               init();
            char u,v,temp;
            getchar();
             int u1,v1;
            for(int i=1;i<=q;i++){
                scanf("%c%c%c",&u,&temp,&v);
                getchar();
                u1=u-'A'+1;
                v1=v-'A'+1;
                if(temp=='>')
                 addedge(u1,v1);
                 else
                    addedge(v1,u1);
            }
            int cnt;
           for(int i=1;i<=n;i++){
               head_num=0;
            head_bfs(i);
            head[i]=head_num;
              tail_num=0;
            tail_bfs(i);
            tail[i]=tail_num;
           }
           bool flag=false;
           char c='A';
           for(int i=1;i<=n;i++){
               if(head[i]+tail[i]==n-1){
                 printf("%c %d
    ",c+i-1,tail[i]+1);
                 flag=true;
               }
           }
           if(!flag)
            printf("-1
    ");
        }
        return 0;
    }
  • 相关阅读:
    access 导数据到sql server 2008
    axis2 调用.net基于https的WebService接口
    android layout 属性大全
    sqlite-manager
    android Permission 访问权限许可
    ImageSwitcher 右向左滑动的实现方式
    java 全角半角转换函数
    Delphi中使用Office中VBA的优缺点
    Delphi中控制VBA 宏
    Delphi 与 Word_VBA
  • 原文地址:https://www.cnblogs.com/13224ACMer/p/4867580.html
Copyright © 2011-2022 走看看