zoukankan      html  css  js  c++  java
  • 洛谷 P1718 图形复原

    题目描述

    HWX小朋友对几何的热爱在电脑组是出了名的,号称“每题必解”,这天,LXC在玩logo的时候突然想到了一个题目,刚好可以去测试一下他封号的虚实,于是,他logo编程画了一个n边形,并且将n个顶点用1,2,3,…,n这n个连续自然数随手编了个号,为了增加难度,他又画了一些不相交的对角线。如下图:

    他把所有的边和对角线都写在一张纸上,对于上图,他写了:(1,3),(3,2),(2,4),(4,5),(5,1),(1,4),(3,4)。正得意的时候,电脑突然自动重启了,郁闷的是,他忘记保存刚才的logo程序了,此刻的他很想利用纸上记录的信息将这个n边形的编号复原,电脑组的你能帮助他吗?

    输入输出格式

    输入格式:

     

    第一行n(n<=50)

    下面若干行,每行两个数a,b,表示纸上记录的信息。

     

    输出格式:

     

    仅一行,按字典序较小的顺序依次输出顶点的编号。对于上面的例子,你的输出应该是1 3 2 4 5。

     

    输入输出样例

    输入样例#1: 复制
    5
    1 3
    3 2
    2 4
    4 5
    5 1
    1 4
    3 4
    
    输出样例#1: 复制
    1 3 2 4 5
    思路:搜索。
    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    using namespace std;
    int n,m;
    int ans[60],vis[60],map[60][60];
    bool dfs(int now,int tot){
        if(tot==n+1&&now==1)    return true;
        for(int i=1;i<=n;i++)
            if(map[now][i]&&!vis[i]){
                vis[i]=1;map[now][i]=map[i][now]=0;ans[tot]=i;
                if(dfs(i,tot+1))    return true;
                vis[i]=0;map[now][i]=map[i][now]=1;
            }
        return false;
    }
    int main(){
        scanf("%d",&n);
        int a,b;
        while(scanf("%d%d",&a,&b)!=EOF)
            map[a][b]=map[b][a]=1;
        dfs(1,1);
        cout<<"1"<<" ";
        for(int i=1;i<n;i++)
            cout<<ans[i]<<" ";
    }
     
    细雨斜风作晓寒。淡烟疏柳媚晴滩。入淮清洛渐漫漫。 雪沫乳花浮午盏,蓼茸蒿笋试春盘。人间有味是清欢。
  • 相关阅读:
    cf B. Sereja and Suffixes
    cf E. Dima and Magic Guitar
    cf D. Dima and Trap Graph
    cf C. Dima and Salad
    最短路径问题(floyd)
    Drainage Ditches(网络流(EK算法))
    图结构练习—BFSDFS—判断可达性(BFS)
    Sorting It All Out(拓扑排序)
    Power Network(最大流(EK算法))
    Labeling Balls(拓扑)
  • 原文地址:https://www.cnblogs.com/cangT-Tlan/p/8017754.html
Copyright © 2011-2022 走看看