Shanghai 2004(UVaLive 3263) - That Nice Euler Circuit

来源:互联网 发布:手游编程 编辑:程序博客网 时间:2024/06/04 19:49

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 secondstruct 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_JUDGEfreopen("in.txt","r",stdin);#endifwhile(sf("%d",&n),n){read();sovle();}return 0;}


Code :


原创粉丝点击