CF-27D. Ring Road 2(涂色)

本文介绍了一个关于城市规划中新建道路不交叉的问题,并提供了一种通过内部或外部曲线绘制新道路的解决方案。通过DFS深度优先搜索算法,判断每条新路是否可以避免与其他路交叉。

D. Ring Road 2
time limit per test
2 seconds
memory limit per test
256 megabytes
input
standard input
output
standard output

It is well known that Berland has n cities, which form the Silver ring — cities i and i + 1 (1 ≤ i < n) are connected by a road, as well as the cities n and 1. The goverment have decided to build m new roads. The list of the roads to build was prepared. Each road will connect two cities. Each road should be a curve which lies inside or outside the ring. New roads will have no common points with the ring (except the endpoints of the road).

Now the designers of the constructing plan wonder if it is possible to build the roads in such a way that no two roads intersect (note that the roads may intersect at their endpoints). If it is possible to do, which roads should be inside the ring, and which should be outside?

Input

The first line contains two integers n and m (4 ≤ n ≤ 100, 1 ≤ m ≤ 100). Each of the following m lines contains two integers ai and bi(1 ≤ ai, bi ≤ n, ai ≠ bi). No two cities will be connected by more than one road in the list. The list will not contain the roads which exist in the Silver ring.

Output

If it is impossible to build the roads in such a way that no two roads intersect, output Impossible. Otherwise print m characters. i-th character should be i, if the road should be inside the ring, and o if the road should be outside the ring. If there are several solutions, output any of them.

Sample test(s)
input
4 2
1 3
2 4
output
io
input
6 3
1 3
3 5
5 1
output
ooo

思路:就三种情况,相交,一个在另一段里,在另一段外,每次选择一段相交的涂不同颜色,如果涂到已图色,且和需要图的颜色不同则无解


#include<iostream>
#include<cstring>
using namespace std;
const int mm=110;
int a[mm],b[mm],c[mm];
int n,m;
bool flag;
void dfs(int u,int col)
{
  if(c[u]==-1)
  {
    c[u]=col;
    for(int i=0;i<m;i++)///找相交
    {
      if(a[u]!=a[i]&&b[u]!=b[i])
      {
        if(a[u]<a[i]&&b[u]>a[i]&&b[u]<b[i])
          dfs(i,col^1);
        if(a[i]<a[u]&&b[i]>a[u]&&b[i]<b[u])
          dfs(i,col^1);
      }
    }
  }
  else if(c[u]^col)flag=0;
}
int main()
{
  while(cin>>n>>m)
  { flag=1;
    memset(c,-1,sizeof(c));
    for(int i=0;i<m;i++)
    {
      cin>>a[i]>>b[i];a[i]--,b[i]--;
      if(a[i]>b[i])a[i]^=b[i],b[i]^=a[i],a[i]^=b[i];///a<b
    }
    for(int i=0;i<m;i++)
      if(c[i]==-1)
      dfs(i,0);
    if(flag)
      for(int i=0;i<m;i++)
      cout<<(c[i]?'i':'o');
    else cout<<"Impossible\n";
    cout<<"\n";
  }
}



转载于:https://www.cnblogs.com/nealgavin/archive/2013/02/08/3206158.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值