Cycle in Graph(Codeforce 263D)简单搜索

description
  One day Vasya came up to the blackboard and wrote out n distinct integers from 1 to n in some order in a circle. Then he drew arcs to join the pairs of integers (a, b) (a ≠ b), that are either each other’s immediate neighbors in the circle, or there is number c, such that a and с are immediate neighbors, and b and c are immediate neighbors. As you can easily deduce, in the end Vasya drew 2·n arcs.
  For example, if the numbers are written in the circle in the order 1, 2, 3, 4, 5 (in the clockwise direction), then the arcs will join pairs of integers (1, 2), (2, 3), (3, 4), (4, 5), (5, 1), (1, 3), (2, 4), (3, 5), (4, 1) and (5, 2).
  Much time has passed ever since, the numbers we wiped off the blackboard long ago, but recently Vasya has found a piece of paper with 2·n written pairs of integers that were joined with the arcs on the board. Vasya asks you to find the order of numbers in the circle by these pairs.

Input
  The first line of the input contains a single integer n (5 ≤ n ≤ 105) that shows, how many numbers were written on the board. Next 2·n lines contain pairs of integers ai, bi (1 ≤ ai, bi ≤ n, ai ≠ bi) — the numbers that were connected by the arcs.
  It is guaranteed that no pair of integers, connected by a arc, occurs in the input more than once. The pairs of numbers and the numbers in the pairs are given in the arbitrary order.

Output
  If Vasya made a mistake somewhere and there isn’t any way to place numbers from 1 to n on the circle according to the statement, then print a single number “-1” (without the quotes). Otherwise, print any suitable sequence of n distinct integers from 1 to n.
  If there are multiple solutions, you are allowed to print any of them. Specifically, it doesn’t matter which number you write first to describe the sequence of the order. It also doesn’t matter whether you write out the numbers in the clockwise or counter-clockwise direction.

Examples
inputCopy

5
1 2
2 3
3 4
4 5
5 1
1 3
2 4
3 5
4 1
5 2

outputCopy
1 2 3 4 5

inputCopy
6
5 6
4 3
5 3
2 4
6 1
3 1
6 2
2 5
1 4
3 6
1 2
4 5
outputCopy
1 2 4 5 3 6
题目大意:从1~N个字符按一定顺序排成一圈,相邻配对或者隔一个配对产生2*N对。给你2N对数,求原顺序。

思路总结:一开始以为所有配对数都是顺时针相连,但是只能过样例。后来才发现是无向的。该题思路是通过从1开始枚举他相连到的数,它两个肯定有两个公共点,1前,和相连数后(相对的)。依次顺下去直到所有点都访问,或者不能再访问。

AC代码

#include<bits/stdc++.h>
using namespace std;

const int N=100100;
int n,u,v,i,vis[N];

vector<int>ans;
set<int>edges[N];

bool check(int u,int v,int p)//u,是当前环节,v是后一个环节。p是上一个环节
{
    if(p>0&&!edges[p].count(v))  return 0;//如果p与v无连接,直接结束,而p=0是初始情况,无需判断
    int cnt=0;
    for(int x : edges[v]) cnt+=edges[u].count(x); //枚举当前v指向的点,必有与u有两个相同点。
    return(cnt>=2);
    
}

void solve(int u=1,int p=0)
{
    if(vis[u]++)  return;
    ans.push_back(u);
    for(int v : edges[u])
        if(!vis[v]&&check(u,v,p)) return solve(v,u);//为了防止顺序混乱,用visit数组标记,并在第一个可行的结束
}

int main()
{
    cin>>n;
    for(i=0; i<2*n; ++i)
    {
        scanf("%d%d",&u,&v);
        edges[u].insert(v);
        edges[v].insert(u);//使图成为无向的
    }
    solve();
    if(ans.size()!=n) return printf("-1"),0;
    for(int x : ans) printf("%d ",x);
    return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值