Shanghai 2004(UVaLive 3263) - That Nice Euler Circuit

Link To The Problem


Solution : 離散化,歐拉平面公式: V - E + F = 2

// Shanghai 2004 That Nice Euler Circuit
// Solution : 

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
#include<queue>

using namespace std;
#define FOR(i,a,b) for(int (i)=(a);(i)<=(b);(i)++)
#define DOR(i,a,b) for(int (i)=(a);(i)>=(b);(i)--)

#define oo 1e6
#define eps 1e-10
#define nMax 1010

//{ 
#define pb push_back
#define dbg(x) cerr << __LINE__ << ": " << #x << " = " << x << endl

#define F first
#define S second

#define bug puts("OOOOh.....");
#define zero(x) (((x)>0?(x):-(x))<eps)

#define LL long long
#define DB double 

#define sf scanf
#define pf printf
#define rep(i,n) for(int (i)=0;(i)<(n);(i)++)

double const pi = acos(-1.0);
double const inf = 1e9;
double inline sqr(double x) { return x*x; }

int dcmp(double x){
    if(fabs(x)<eps) return 0;
    return x>0?1:-1;
}

#define point pair<double,double> 
#define x first
#define y second

struct line{
	point a,b;
	line() {};
	line(point a,point b):a(a),b(b){};
};

int n,cas=1;
vector<line> l;
vector<point> event,v;
point a[4000];

double det(point u,point v) {
	return u.x*v.y - u.y*v.x;
}
double dot(point u,point v) {
	return u.x*v.x + u.y*v.y;
}
point Mul(point u,point v){
	return point(u.x-v.x,u.y-v.y);
}
int parallel(line u,line v){
	return dcmp(det(Mul(u.a,u.b),Mul(v.a,v.b)))==0;
}
point intersection(line u,line v) {
	point ret = u.a;
	double t = det(Mul(u.a,v.a),Mul(v.a,v.b)) / det(Mul(u.a,u.b),Mul(v.a,v.b));
	ret.x += (u.b.x-u.a.x)*t;
	ret.y += (u.b.y-u.a.y)*t;
	return ret;
}
int dot_on_seg(point p,point u,point v){
	return dcmp(det(Mul(p,u),Mul(v,p)))==0 && dcmp(dot(Mul(p,u),Mul(p,v)))<0;
}
int dot_in_seg(point p,point u,point v){
	return dcmp(det(Mul(p,u),Mul(v,p)))==0 && dcmp(dot(Mul(p,u),Mul(p,v)))<=0;
}
int intersection(line u,line v,point &tmp){
	if(parallel(u,v)) return 0;
	tmp = intersection(u,v);
	return dot_in_seg(tmp,u.a,u.b) && dot_in_seg(tmp,v.a,v.b);
//	return 1;
}

void read(){
	rep(i,n) sf("%lf%lf",&a[i].F,&a[i].S);
	n--;
	l.clear();
	event.clear();
	rep(i,n) {
		l.pb(line(a[i],a[i+1]));
		event.pb(a[i]);
	}
}
int small(point u,point v) {
	if(dcmp(u.x-v.x)==0) return dcmp(u.y-v.y) < 0;
	return dcmp(u.x-v.x) < 0;
}
int equal(point u,point v) {
	return dcmp(u.x-v.x)==0 && dcmp(u.y-v.y)==0;
}

void sovle(){
	point p;
	//event.clear();
	rep(i,n) for(int j=i+1;j<n;j++){
		if(intersection(l[i],l[j],p)){
			event.pb(p);
		}
	}
	sort(event.begin(),event.end(),small);
	v.clear();
	point tmp = event[0];
	v.pb(tmp);
	for(int i=0;i<event.size();i++) {
		if(equal(tmp,event[i])) continue;
		tmp = event[i];
		v.pb(tmp);
	}

	int F=0,V=0,E=n;
	V = v.size();
	for(int i=0;i<V;i++){
		for(int j=0;j<n;j++){
			if(dot_on_seg(v[i],a[j],a[j+1])) E++;
		}
	}
	//dbg(V);
	F = E-V+2;
	pf("Case %d: There are %d pieces.\n",cas++,F);
	return ;
}


int main() {
#ifndef ONLINE_JUDGE
	freopen("in.txt","r",stdin);
#endif

	while(sf("%d",&n),n){
		read();
		sovle();
	}
	return 0;
}


Code :


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章