Language: C++

#include <iostream>
#include <vector>
#include <map>
#include <string>
#include <complex>
#include <algorithm>

using namespace std;

typedef complex<double> Point;
typedef vector<Point> Polygon;
const int N = 10;
const double EPS = 1.0e-10;

bool is_Online(Point &a, Point &b, Point &c){
  return abs(a-c)+abs(b-c)<abs(a-b)+EPS;
}

bool is_touch(Polygon &a, Polygon &b){
  for(int i=0;i<a.size();i++){
    for(int j=0;j<b.size();j++){
      bool c[4];
      Point p1=a[i], p2, p3=b[j], p4;
      if(i==a.size()-1 && j==b.size()-1){
	p2=a[0];
	p4=b[0];
      }else if(i==a.size()-1){
	p2=a[0];
	p4=b[j+1];
      }else if(j==b.size()-1){
	p2=a[i+1];
	p4=b[0];
      }else{
	p2=a[i+1];
	p4=b[j+1];
      }
      c[2]=is_Online(p1, p2, p3);
      c[3]=is_Online(p1, p2, p4);
      c[0]=is_Online(p3, p4, p1);
      c[1]=is_Online(p3, p4, p2);
      if((c[0] && c[1]) || (c[2] && c[3])) return true;
    }
  }
  return false;
}

bool is_Touch(vector<Polygon> &a, vector<Polygon> &b){
  for(int i=0;i<a.size();i++){
    for(int j=0;j<b.size();j++){
      if(is_touch(a[i], b[j])) return true;
    }
  }
  return false;
}

void make_graph(vector<int> *edge, vector<Polygon> *country, int n){
  for(int i=0;i<n;i++){
    for(int j=i+1;j<n;j++){
      if(is_Touch(country[i], country[j])) edge[i].push_back(j), edge[j].push_back(i);
    }
  }
}

int ans;
void dfs(int now, int n, int cnt, vector<int> *G, int *color, bool *used){
  if(cnt>ans) return;
  if(now==n){
    ans=min(ans, cnt);
    return;
  }
  for(int i=now;i>=0;i--){
    bool f=true;
    for(int j=0;j<G[now].size();j++){
      if(color[G[now][j]]==i){
	f=false;
	break;
      }
    }
    if(f){
      bool tmp=used[i];
      color[now]=i;
      if(used[i]){
	dfs(now+1, n, cnt, G, color, used);
      }else{
	used[i]=true;
	dfs(now+1, n, cnt+1, G, color, used);
	used[i]=false;
      }
      color[now]=-1;
    }
  }
}

main(){
  int n;
  while(1){
    cin >> n;
    if(n==0) break;
    vector<Polygon> country[N];
    int color[N];
    map<string, int> ntoi;
    bool used[N];
    vector<int> G[N];
    fill(used, used+N, false);
    int index=0;
    for(int i=0;i<n;i++){
      string name;
      cin >> name;
      if(ntoi.find(name)==ntoi.end()){
	ntoi[name]=index++;
      }
      Polygon in;
      while(1){
	Point t;
	cin >> t.real();
	if(t.real()==-1) break;
	cin >> t.imag();
	in.push_back(t);
      }
      country[ntoi[name]].push_back(in);
    }
    for(int i=0;i<n;i++){
      for(int j=i+1;j<n;j++){
	if(is_Touch(country[i], country[j])) G[i].push_back(j), G[j].push_back(i);
      }
    }
    fill(color, color+N, -1);
    ans=4;
    dfs(0, ntoi.size(), 0, G, color, used);
    cout << ans << endl;
   

Compiler output:
a.cc:94:1: warning: ISO C++ forbids declaration of 'main' with no type [-Wreturn-type]
   94 | main(){
      | ^~~~
a.cc: In function 'int main()':
a.cc:115:13: error: no match for 'operator>>' (operand types are 'std::istream' {aka 'std::basic_istream<char>'} and 'double')
  115 |         cin >> t.real();
      |         ~~~ ^~ ~~~~~~~~
      |         |            |
      |         |            double
      |         std::istream {aka std::basic_istream<char>}
In file included from /usr/include/c++/14/iostream:42,
                 from a.cc:1:
/usr/include/c++/14/istream:170:7: note: candidate: 'std::basic_istream<_CharT, _Traits>::__istream_type& std::basic_istream<_CharT, _Traits>::operator>>(bool&) [with _CharT = char; _Traits = std::char_traits<char>; __istream_type = std::basic_istream<char>]' (near match)
  170 |       operator>>(bool& __n)
      |       ^~~~~~~~
/usr/include/c++/14/istream:170:7: note:   conversion of argument 1 would be ill-formed:
a.cc:115:22: error: cannot bind non-const lvalue reference of type 'bool&' to a value of type 'double'
  115 |         cin >> t.real();
      |                ~~~~~~^~
/usr/include/c++/14/istream:174:7: note: candidate: 'std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::operator>>(short int&) [with _CharT = char; _Traits = std::char_traits<char>]' (near match)
  174 |       operator>>(short& __n);
      |       ^~~~~~~~
/usr/include/c++/14/istream:174:7: note:   conversion of argument 1 would be ill-formed:
a.cc:115:22: error: cannot bind non-const lvalue reference of type 'short int&' to a value of type 'double'
  115 |         cin >> t.real();
      |                ~~~~~~^~
/usr/include/c++/14/istream:177:7: note: candidate: 'std::basic_istream<_CharT, _Traits>::__istream_type& std::basic_istream<_CharT, _Traits>::operator>>(short unsigned int&) [with _CharT = char; _Traits = std::char_traits<char>; __istream_type = std::basic_istream<char>]' (near match)
  177 |       operator>>(unsigned short& __n)
      |       ^~~~~~~~
/usr/include/c++/14/istream:177:7: note:   conversion of argument 1 would be ill-formed:
a.cc:115:22: error: cannot bind non-const lvalue reference of type 'short unsigned int&' to a value of type 'double'
  115 |         cin >> t.real();
      |                ~~~~~~^~
/usr/include/c++/14/istream:181:7: note: candidate: 'std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::operator>>(int&) [with _CharT = char; _Traits = std::char_traits<char>]' (near match)
  181 |       operator>>(int& __n);
      |       ^~~~~~~~
/usr/include/c++/14/istream:181:7: note:   conversion of argument 1 would be ill-formed:
a.cc:115:22: error: cannot bind non-const lvalue reference of type 'int&' to a value of type 'double'
  115 |         cin >> t.real();
      |                ~~~~~~^~
/usr/include/c++/14/istream:184:7: note: candidate: 'std::basic_istream<_CharT, _Traits>::__istream_type& std::basic_istream<_CharT, _Traits>::operator>>(unsigned int&) [with _CharT = char; _Traits = std::char_traits<char>; __istream_type = std::basic_istream<char>]' (near match)
  184 |       operator>>(unsigned int& __n)
      |       ^~~~~~~~
/usr/include/c++/14/istream:184:7: note:   conversion of argument 1 would be ill-formed:
a.cc:115:22: error: cannot bind non-const lvalue reference of type 'unsigned int&' to a value of type 'double'
  115 |         cin >> t.real();
      |                ~~~~~~^~
/usr/include/c++/14/istream:188:7: note: candidate: 'std::basic_istream<_CharT, _Traits>::__istream_type& std::basic_istream<_CharT, _Traits>::operator>>(long int&) [with _CharT = char; _Traits = std::char_traits<char>; __istream_type = std::basic_istream<char>]' (near match)
  188 |       operator>>(long& __n)
      |       ^~~~~~~~
/usr/include/c++/14/istream:188:7: note:   conversion of argument 1 would be ill-formed:
a.cc:115:22: error: cannot bind non-const lvalue reference of type 'long int&' to a value of type 'double'
  115 |         cin >> t.real();
      |                ~~~~~~^~
/usr/include/c++/14/istream:192:7: note: candidate: 'std::basic_istream<_CharT, _Traits>::__istream_type& std::basic_istream<_CharT, _Traits>::operator>>(long unsigned int&) [with _CharT = char; _Traits = std::char_traits<char>; __istream_type = std::basic_istream<char>]' (near match)
  192 |       operator>>(unsigned long& __n)
      |       ^~~~~~~~
/usr/include/c++/14/istream:192:7: note:   conversion of argument 1 would be ill-formed:
a.cc:115:22: error: cannot bind non-const lvalue reference of type 'long unsigned int&' to a value of type 'double'
  115 |         cin >> t.real();
      |                ~~~~~~^~
/usr/include/c++/14/istream:199:7: note: candidate: 'std::basic_istream<_CharT, _Traits>::__istream_type& std::basic_istream<_CharT, _Traits>::operator>>(long long int&) [with _CharT = char; _Traits = std::char_traits<char>; __istream_type = std::basic_istream<char>]' (near match)
  199 |       operator>>(long long& __n)
      |       ^~~~~~~~
/usr/include/c++/14/istream:199:7: note:   conversion of argument 1 would be ill-formed:
a.cc:115:22: error: cannot bind non-const lvalue reference of type 'long long int&' to a value of type 'double'
  115 |         cin >> t.real();
      |                ~~~~~~^~
/usr/include/c++/14/istream:203:7: note: candidate: 'std::basic_istream<_CharT, _Traits>::__istream_type& std::basic_istream<_CharT, _Traits>::operator>>(long long unsigned int&) [with _CharT = char; _Traits = std::char_traits<char>; __istream_type = std::basic_istream<char>]' (near match)
  203 |       operator>>(unsigned long long& __n)
      |       ^~~~~~~~
/usr/include/c++/14/istream:203:7: note:   conversion of argument 1 would be ill-formed:
a.cc:115:22: error: cannot bind non-const lvalue reference of type 'long long unsigned int&' to a value of type 'double'
  115 |         cin >> t.real();
      |                ~~~~~~^~
/usr/include/c++/14/istream:219:7: note: candidate: 'std::basic_istream<_CharT, _Traits>::__istream_type& std::basic_istream<_CharT, _Traits>::operator>>(float&) [with _CharT = char; _Traits = std::char_traits<char>; __istream_type = std::basic_istream<char>]' (near match)
  219 |       operator>>(float& __f)
      |       ^~~~~~~~
/usr/include/c++/14/istream:219:7: note:   conversion of argument 1 would be ill-formed:
a.cc:115:22: error: cannot bind non-const lvalue reference of type 'float&' to a value of type 'double'
  115 |         cin >> t.real();
      |                ~~~~~~^~
/usr/include/c++/14/istream:223:7: note: candidate: 'std::basic_istream<_CharT, _Traits>::__istream_type& std::basic_istream<_CharT, _Traits>::operator>>(double&) [with _CharT = char; _Traits = std::char_traits<char>; __istream_type = std::basic_istream<char>]' (near match)
  223 |       operator>>(double& __f)
      |       ^~~~~~~~
/usr/include/c++/14/istream:223:7: note:   conversion of argument 1 would be ill-formed:
a.cc:115:22: error: cannot bind non-const lvalue reference of type 'double&' to an rvalue of type 'double'
  115 |         cin >> t.real();
      |                ~~~~~~^~
/usr/include/c++/14/istream:227:7: note: candidate: 'std::basic_istream<_CharT, _Traits>::__istream_type& std::basic_istream<_CharT, _Traits>::operator>>(long double&) [with _CharT = char; _Traits = std::char_traits<char>; __istream_type = std::basic_istream<char>]' (near match)
  227 |       operator>>(long double& __f)
      |       ^~~~~~~~
/usr/include/c++/14/istream:227:7: note:   conversion of argument 1 would be ill-formed:
a.cc:115:22: error: cannot bind non-const lvalue reference of type 'long double&' to a value of type 'double'
  115 |         cin >> t.real();
      |                ~~~~~~^~
/usr/include/c++/14/istream:328:7: note: candidate: 'std::basic_istream<_CharT, _Traits>::__istream_type& std::basic_istream<_CharT, _Traits>::operator>>(void*&) [with _CharT = char; _Traits = std::char_traits<char>; __istream_type = std::basic_istream<char>]'
  328 |       operator>>(void*& __p)
      |       ^~~~~~~~
/usr/include/c++/14/istream:328:25: note:   no known conversion for argument 1 from 'double' to 'void*&'
  328 |       operator>>(void*& __p)
      |                  ~~~~~~~^~~
/usr/include/c++/14/istream:122:7: note: candidate: 'std::basic_istream<_CharT, _Traits>::__istream_type& std::basic_istream<_CharT, _Traits>::operator>>(__istream_type& (*)(__istream_type&)) [with _CharT = char; _Traits = std::char_traits<char>; __istream_type = std::basic_istream<char>]'
  122 |       operator>>(__istream_type& (*__pf)(__istream_type&))
      |       ^~~~~~~~
/usr/include/c++/14/istream:122:36: note:   no known conversion for argument 1 from 'double' to 'std::basic_istream<char>::__istream_type& (*)(std::basic_istream<char>::__istream_type&)' {aka 'std::basic_istream<char>& (*)(std::basic_istream<char>&)'}
  122 |       operator>>(__istream_type& (*__pf)(__istream_type&))
      |                  ~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~
/usr/include/c++/14/istream:126:7: note: candidate: 'std::basic_istream<_CharT, _Traits>::__istream_type& std::basic_istream<_CharT, _Traits>::operator>>(__ios_type& (*)(__ios_type&)) [with _CharT = char; _Traits = std::char_traits<char>; __istream_type = std::basic_istream<char>; __ios_type = std::basic_ios<char>]'
  126 |       operator>>(__ios_type& (*__pf)(__ios_type&))
      |       ^~~~~~~~
/usr/include/c++/14/istream:126:32: note:   no known conversion for argument 1 from 'double' to 'std::basic_istream<char>::__ios_type& (*)(std::basic_istream<char>::__ios_type&)' {aka 'std::basic_ios<char>& (*)(std::basic_ios<char>&)'}
  126 |       operator>>(__ios_type& (*__pf)(__ios_type&))
      |                  ~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~
/usr/include/c++/14/istream:133:7: note: candidate: 'std::basic_istream<_CharT, _Traits>::__istream_type& std::basic_istream<_CharT, _Traits>::operator>>(std::ios_base& (*)(std::ios_base&)) [with _CharT = char; _Traits = std::char_traits<char>; __istream_type = std::basic_istream<char>]'
  133 |       operator>>(ios_base& (*__pf)(ios_base&))
      |       ^~~~~~~~
/usr/include/c++/14/istream:133:30: note:   no known conversion for argument 1 from 'double' to 'std::ios_base& (*)(std::ios_base&)'