青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

題目要求統計一個平面圖中所有邊數為k的面的個數。應該是個經典問題。說說我的算法吧。
枚舉每條邊,做以下的基本步驟。

基本步驟:以這條邊作起始邊,不斷地找下一條“最左轉”的邊,并且標記每個點的訪問次數,直到某個點第3次被訪問為止。
經過這個步驟之后,得到一個頂點序列。容易知道,當且僅當這個頂點序列是2-重復(就是形如12341234這樣),并且是逆時針旋轉的,那么就是一個面。
接下去我們就把所有找到的邊數為k面進行hash去重,就得到答案啦。
貌似我想的這個算法不夠好,如果有更好的算法,歡迎和我討論。


/*************************************************************************
Author: WHU_GCC
Created Time: 2007-9-7 16:26:27
File Name: pku1092.cpp
Description: 
***********************************************************************
*/

#include 
<iostream>
#include 
<cmath>
using namespace std;

#define out(x) (cout << #x << ": " << x << endl)
typedef 
long long int64;
const int maxint = 0x7FFFFFFF;
const int64 maxint64 = 0x7FFFFFFFFFFFFFFFLL;
template 
<class T> void show(T a, int n) for (int i = 0; i < n; ++i) cout << a[i] << ' '; cout << endl; }
template 
<class T> void show(T a, int r, int l) for (int i = 0; i < r; ++i) show(a[i], l); cout << endl; }

const int maxn = 210;
const int prime = 502973;

typedef 
struct point_t
{
    
int x, y, id;
    
int cnt_child;
    
int child[maxn];
}
;

typedef 
struct farmland_t
{
    
int cnt;
    
int v[maxn];
}
;

typedef 
struct hash_t
{
    farmland_t farmland;
    hash_t 
*next;
}
;

int n, size;
point_t point[maxn];

hash_t 
*hash[prime];

int operator ==(const farmland_t &a, const farmland_t &b)
{
    
if (a.cnt != b.cnt)
        
return 0;
    
for (int i = 0; i < a.cnt; i++)
        
if (a.v[i] != b.v[i])
            
return 0;
    
return 1;
}


int hash_insert(const farmland_t &farmland)
{
    unsigned 
int key = 1;
    
for (int i = 0; i < farmland.cnt; i++)
        key 
*= farmland.v[i];
    key 
%= prime;

    
for (hash_t *= hash[key]; t; t = t->next)
        
if (t->farmland == farmland)
            
return 0;
    hash_t 
*= new hash_t;
    t
->farmland = farmland;
    t
->next = hash[key];
    hash[key] 
= t;
    
return 1;
}


int dot_mul(const point_t &a, const point_t &b)
{
    
return a.x * b.x + a.y * b.y;
}


int cross_mul(const point_t &a, const point_t &b)
{
    
return a.x * b.y - a.y * b.x;
}


point_t 
operator -(const point_t &a, const point_t &b)
{
    point_t ret;
    ret.x 
= a.x - b.x;
    ret.y 
= a.y - b.y;
    
return ret;
}


double len(const point_t &a)
{
    
return sqrt(double(a.x * a.x + a.y * a.y));
}


double angle_a_to_b(const point_t &a, const point_t &b)
{
    
double ret = acos(dot_mul(a, b) / (len(a) * len(b)));
    
int cross = cross_mul(a, b);
    
if (cross == 0)
        
return 0.0;
    
else if (cross > 0)
        
return -ret;
    
else
        
return ret;
}


int find_farmland(int a, int b, farmland_t &farmland)
{
    
int stack[maxn * 2];
    
int top = 2;
    stack[
0= a;
    stack[
1= b;
    
int used[maxn];
    memset(used, 
0sizeof(used));
    used[a] 
= used[b] = 1;

    
while (1)
    
{
        
double min_angle = 1e10;
        
int min_i;
        
for (int i = 0; i < point[stack[top - 1]].cnt_child; i++)
        
{
            
int p = point[stack[top - 1]].child[i];
            
if (p == stack[top - 2])
                
continue;
            
double angle = angle_a_to_b(point[stack[top - 1]] - point[stack[top - 2]], point[p] - point[stack[top - 1]]);
            
if (angle < min_angle)
            
{
                min_angle 
= angle;
                min_i 
= p;
            }

        }

        
if (used[min_i] == 2)
        
{
            
if (min_i != a)
                
return 0;
            
if (top & 1)
                
return 0;
            
if (top / 2 != size)
                
return 0;
            
for (int i = 0; i < top / 2; i++)
                
if (stack[i] != stack[i + top / 2])
                    
return 0;
            
int area = 0;
            
for (int i = 0; i < top / 2; i++)
                area 
+= cross_mul(point[stack[i]], point[stack[i + 1]]);
            
if (area <= 0)
                
return 0;

            
{
                farmland.cnt 
= top / 2;
                
int min = maxint;
                
int mini;
                
for (int i = 0; i < top / 2; i++)
                    
if (stack[i] < min)
                    
{
                        min 
= stack[i];
                        mini 
= i;
                    }

                
for (int i = 0; i < top / 2; i++)
                    farmland.v[i] 
= stack[mini + i];
                
return 1;
            }

        }

        
else
        
{
            used[min_i]
++;
            stack[top
++= min_i;
        }

    }

}


int count_farmland()
{
    memset(hash, 
0sizeof(hash));
    
int cnt = 0;
    
for (int i = 1; i <= n; i++)
        
for (int j = 0; j < point[i].cnt_child; j++)
        
{
            farmland_t farmland;
            
int flag = find_farmland(i, point[i].child[j], farmland);
            
if (flag)
                
if (hash_insert(farmland))
                    cnt
++;
        }

    
return cnt;
}


int main()
{
    
int ca;
    
for (scanf("%d"&ca); ca--;)
    
{
        scanf(
"%d"&n);
        
for (int i = 1; i <= n; i++)
        
{
            scanf(
"%d%d%d%d"&point[i].id, &point[i].x, &point[i].y, &point[i].cnt_child);
            
for (int j = 0; j < point[i].cnt_child; j++)
                scanf(
"%d"&point[i].child[j]);
        }

        scanf(
"%d"&size);
        printf(
"%d\n", count_farmland());
    }

    
return 0;
}
posted on 2007-09-07 19:37 Felicia 閱讀(676) 評論(0)  編輯 收藏 引用 所屬分類: 計算幾何
 
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲天堂av在线免费观看| 亚洲欧美在线x视频| 欧美一区综合| 美女日韩欧美| 亚洲九九爱视频| 国产精品久久午夜夜伦鲁鲁| 香蕉成人啪国产精品视频综合网| 噜噜噜噜噜久久久久久91| 亚洲精品久久久久久一区二区 | 欧美精品一区二区三区蜜桃| 一本色道久久88综合日韩精品| 久久成人在线| 亚洲人成在线播放| 欧美性开放视频| 久久五月激情| 亚洲无毛电影| 麻豆精品一区二区av白丝在线| 一区二区欧美在线| 樱花yy私人影院亚洲| 欧美视频一区二区三区四区| 久久狠狠亚洲综合| 一本色道久久综合狠狠躁篇的优点 | 国产精品一区久久| 你懂的国产精品| 亚洲午夜精品久久| 欧美激情第8页| 久久精品二区| 亚洲一区二区视频| 亚洲福利在线视频| 国产欧美日韩一区二区三区| 欧美a一区二区| 久久精品91久久香蕉加勒比| 国产精品99久久99久久久二8| 欧美高清视频免费观看| 久久国产日韩欧美| 在线综合亚洲| 亚洲国产91| 国产亚洲福利社区一区| 国产精品大片| 欧美人牲a欧美精品| 久久在线免费观看| 性欧美video另类hd性玩具| 亚洲精选在线观看| 欧美激情按摩| 欧美成人精品在线视频| 久久国产日韩欧美| 久久蜜臀精品av| 久久精品国产亚洲5555| 亚洲欧美高清| 亚洲免费在线观看| 99国产精品| 亚洲人成网站色ww在线| 久久蜜臀精品av| 久久久久久一区二区| 欧美一区二区私人影院日本| 亚洲在线观看视频| 亚洲免费在线看| 亚洲乱码久久| 91久久久在线| 久久一区中文字幕| 欧美一级在线视频| 亚洲永久在线| 亚洲一区二区在线免费观看视频| 91久久夜色精品国产九色| 亚洲第一在线视频| 欧美xxxx在线观看| 欧美成人精品激情在线观看| 久久久久久亚洲精品中文字幕| 久久久久国产一区二区三区| 久久综合激情| 美女网站在线免费欧美精品| 牛夜精品久久久久久久99黑人| 欧美成人一区二区三区在线观看| 亚洲第一成人在线| 亚洲精品综合久久中文字幕| 日韩亚洲欧美成人一区| 夜夜嗨av一区二区三区四季av | 欧美一区二区三区电影在线观看| 性久久久久久久| 久久久爽爽爽美女图片| 免费久久久一本精品久久区| 欧美喷水视频| 国产精品午夜电影| 国产在线视频不卡二| 在线观看精品| 99国产一区| 欧美亚洲三级| 欧美aa国产视频| 日韩午夜高潮| 亚洲欧美日韩精品在线| 久久久国产精品一区| 欧美国产欧美亚洲国产日韩mv天天看完整| 欧美理论电影在线播放| 国产精品免费aⅴ片在线观看| 国产亚洲电影| 亚洲欧洲综合另类| 亚洲一区二区精品在线观看| 欧美一区网站| 亚洲第一页在线| 亚洲欧美成人一区二区三区| 久久免费国产精品1| 欧美黄色大片网站| 国产精品分类| 亚洲高清视频在线| 亚洲永久免费视频| 狂野欧美激情性xxxx| 亚洲精品少妇30p| 久久国产精品99久久久久久老狼| 美女黄网久久| 国产免费一区二区三区香蕉精| 亚洲电影第三页| 亚洲欧美日韩中文视频| 久久综合伊人77777麻豆| 亚洲精品视频一区| 久久激情五月丁香伊人| 欧美另类极品videosbest最新版本 | 国产日韩一区二区三区在线| 亚洲激情综合| 亚洲一区免费视频| 蜜桃av一区| 亚洲永久网站| 欧美日韩国语| 伊人久久大香线蕉av超碰演员| 这里只有精品丝袜| 蜜月aⅴ免费一区二区三区| 一本色道久久综合狠狠躁篇怎么玩 | 久久精品91| 日韩亚洲成人av在线| 久久婷婷国产麻豆91天堂| 国产精品裸体一区二区三区| 91久久精品www人人做人人爽 | 中文av字幕一区| 午夜精品福利在线| 欧美大胆成人| 亚洲欧美美女| 欧美日韩一区二区国产| 影音先锋久久久| 亚洲欧美一区二区原创| 亚洲精品国产欧美| 免费一级欧美片在线播放| 国产亚洲激情| 欧美一区国产一区| 亚洲一区二区三区精品在线| 欧美精品免费看| 亚洲黄页视频免费观看| 久久综合久久久久88| 欧美伊人久久久久久久久影院| 国产精品va在线播放| 99这里只有久久精品视频| 欧美国产日韩免费| 久久久国产精彩视频美女艺术照福利| 国产精品普通话对白| 亚洲一区欧美二区| 99国产精品视频免费观看| 欧美大胆a视频| 在线观看视频一区二区| 久久久久久999| 欧美在线1区| 国产一区二区在线观看免费| 欧美一区二粉嫩精品国产一线天| 一区二区日韩欧美| 欧美乱大交xxxxx| 亚洲精品免费一二三区| 亚洲大胆视频| 欧美成人精品一区二区| 亚洲欧洲一区二区三区在线观看| 欧美国产日韩一区二区| 欧美mv日韩mv国产网站app| 亚洲国产午夜| 亚洲国产精品久久久久| 欧美激情第三页| 在线视频精品一区| 99亚洲一区二区| 国产精品qvod| 久久国产一区| 久久黄金**| 影音先锋另类| 欧美国产日韩精品| 欧美精品一区二区三区蜜臀 | 亚洲免费人成在线视频观看| 亚洲免费观看高清在线观看 | 午夜一级在线看亚洲| 亚洲字幕在线观看| 国产午夜亚洲精品羞羞网站| 久久综合图片| 欧美高清hd18日本| 一区二区三区国产盗摄| 中文精品视频| 国产综合在线看| 欧美成人首页| 欧美日韩八区| 欧美亚洲日本一区| 久久久伊人欧美| 亚洲裸体俱乐部裸体舞表演av| 99国产精品久久久久久久成人热| 国产精品一区二区三区观看| 久久人人爽人人爽爽久久| 嫩草国产精品入口| 亚洲与欧洲av电影| 久久久精品一区|