zoukankan      html  css  js  c++  java
  • zoj3732&& hdu4797 Graph Reconstruction

    Graph Reconstruction

    Time Limit: 2 Seconds      Memory Limit: 65536 KB      Special Judge

    Let there be a simple graph with N vertices but we just know the degree of each vertex. Is it possible to reconstruct the graph only by these information?

    A simple graph is an undirected graph that has no loops (edges connected at both ends to the same vertex) and no more than one edge between any two different vertices. The degree of a vertex is the number of edges that connect to it.

    Input

    There are multiple cases. Each case contains two lines. The first line contains one integer N (2 ≤ N ≤ 100), the number of vertices in the graph. The second line conrains N integers in which the ith item is the degree of ith vertex and each degree is between 0 and N-1(inclusive).

    Output

    If the graph can be uniquely determined by the vertex degree information, output "UNIQUE" in the first line. Then output the graph.

    If there are two or more different graphs can induce the same degree for all vertices, output "MULTIPLE" in the first line. Then output two different graphs in the following lines to proof.

    If the vertex degree sequence cannot deduced any graph, just output "IMPOSSIBLE".

    The output format of graph is as follows:

    N E
    u

    1

     u

    2

     ... u

    E

    v

    1

     v

    2

     ... v

    EWhere N is the number of vertices and E is the number of edges, and {ui,vi} is the ith edge the the graph. The order of edges and the order of vertices in the edge representation is not important since we would use special judge to verify your answer. The number of each vertex is labeled from 1 to N. See sample output for more detail.

    Sample Input

    1
    0
    6
    5 5 5 4 4 3
    6
    5 4 4 4 4 3
    6
    3 4 3 1 2 0
    

    Sample Output

    UNIQUE
    1 0
    
    
    UNIQUE
    6 13
    3 3 3 3 3 2 2 2 2 1 1 1 5
    2 1 5 4 6 1 5 4 6 5 4 6 4
    MULTIPLE
    6 12
    1 1 1 1 1 5 5 5 6 6 2 2
    5 4 3 2 6 4 3 2 4 3 4 3
    6 12
    1 1 1 1 1 5 5 5 6 6 3 3
    5 4 3 2 6 4 3 2 4 2 4 2
    IMPOSSIBLE

    思路:这是一道坑题.......坑在格式的就不说了,可以原谅oj.如果hdu4797交不过,去zoj3732就能过了,(因为不能specail judge纯oj问题).

    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    using namespace std;
    const int maxn=111;
    int sum,n;
    typedef pair<int ,int > P;
    P deg[maxn];
    P tmpdeg[maxn];
    int ash1[maxn*maxn*2],ash2[maxn*maxn*2],alen;
    
    bool cmp(P A,P B)
    {
       if(A.first==B.first) return A.second<B.second;
        return A.first>B.first;
    }
    void prints(){
        printf("%d %d\n",n,sum>>1);
    
        if(alen>0)printf("%d",ash1[0]);
        for(int i=1;i<alen;i++){
            printf(" %d",ash1[i]);
        }
        puts("");
        if(alen>0)printf("%d",ash2[0]);
        for(int i=1;i<alen;i++){
            printf(" %d",ash2[i]);
        }
        puts("");
    }
    
    void cpy(){
        for(int i=0;i<n;i++)tmpdeg[i]=deg[i];
        sort(tmpdeg,tmpdeg+n,cmp);
    }
    
    bool single;
    bool rebuild(){
        cpy();
        alen=0;
        single=true;
        for(;tmpdeg[0].first>0;){
            int amount=0;
            for(int j=1;j<n;j++){
                if(tmpdeg[j].first>0){
                    amount++;
                }
            }
            if(amount<tmpdeg[0].first)return false;
            if(single&&(tmpdeg[tmpdeg[0].first].first)==(tmpdeg[tmpdeg[0].first+1].first)&&tmpdeg[0].first+1<n){
                    single=false;
            }
            for(int j=1;j<=tmpdeg[0].first;j++){
                tmpdeg[j].first--;
                ash1[alen]=tmpdeg[0].second;
                ash2[alen++]=tmpdeg[j].second;
            }
    
            tmpdeg[0].first=0;
            sort(tmpdeg,tmpdeg+n,cmp);
        }
        return true;
    }
    
    bool rebuild2(){
        cpy();
        alen=0;
        for(;tmpdeg[0].first>0;){
            int amount=0;
            for(int j=1;j<n;j++){
                if(tmpdeg[j].first>0){
                    amount++;
                }
            }
            if(amount<tmpdeg[0].first)return false;
            if((tmpdeg[tmpdeg[0].first].first)==(tmpdeg[tmpdeg[0].first+1].first)&&tmpdeg[0].first+1<n){
                    swap(tmpdeg[tmpdeg[0].first].second,tmpdeg[tmpdeg[0].first+1].second);
            }
            for(int j=1;j<=tmpdeg[0].first;j++){
                tmpdeg[j].first--;
                ash1[alen]=tmpdeg[0].second;
                ash2[alen++]=tmpdeg[j].second;
            }
            tmpdeg[0].first=0;
            sort(tmpdeg,tmpdeg+n,cmp);
        }
        return true;
    }
    
    
    
    int main(){
        while(scanf("%d",&n)==1){
            bool failed =false;
            for(int i=1;i<=n;i++){
                scanf("%d",&(deg[i-1].first));
                deg[i-1].second=i;
                if(deg[i-1].first<0)failed=true;
            }
            sort(deg,deg+n,cmp);
            sum=0;
            for(int i=0;i<n;i++){
                if(deg[i].first>=n)failed=true;
                sum+=deg[i].first;
            }
            if(sum&1)failed=true;
            if(failed||!rebuild()){
                puts("IMPOSSIBLE");
            }
            else if(single){
                puts("UNIQUE");
                prints();
            }
            else {
                puts("MULTIPLE");
                prints();
                rebuild2();
                prints();
            }
        }
        return 0;
    }
    

      

  • 相关阅读:
    从保证业务不中断,看网关的“前世今生”
    如何测试重签名的应用功能是否正常
    利用华为DTM将事件发送到Firebase
    页面生命周期onShow没有触发
    玩转AR,让电商营销锦上添花
    如何解决div样式拉伸问题
    预约直播有奖丨HarmonyOS开发者日 杭州站,等你来“约”!
    从火爆一时的Clubhouse说起,浅谈HMS Core与社交
    快应用如何避免读取undefined变量的属性导致报错
    浅析HMS Core开放能力在HarmonyOS中的应用
  • 原文地址:https://www.cnblogs.com/xuesu/p/3979673.html
Copyright © 2011-2022 走看看