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

我希望你是我獨家記憶

一段永遠封存的記憶,隨風而去
posts - 263, comments - 31, trackbacks - 0, articles - 3
   :: 首頁 :: 新隨筆 ::  :: 聚合  :: 管理

USACO——443——(拓撲排序)

Posted on 2008-08-16 23:02 Hero 閱讀(190) 評論(0)  編輯 收藏 引用 所屬分類: 代碼如詩--ACM
/*
ID: wangzha4
LANG: C++
TASK: frameup
*/
//JUDGE_ID: 65448BI
/*

   Test 1: TEST OK [0.000 secs, 3312 KB]
   Test 2: TEST OK [0.000 secs, 3312 KB]
   Test 3: TEST OK [0.011 secs, 3312 KB]
   Test 4: TEST OK [0.000 secs, 3308 KB]
   Test 5: TEST OK [0.000 secs, 3444 KB]
   Test 6: TEST OK [0.000 secs, 3308 KB]
   Test 7: TEST OK [0.000 secs, 3308 KB]
   Test 8: TEST OK [0.011 secs, 3440 KB]
   Test 9: TEST OK [0.043 secs, 3440 KB]
*/
//拓撲排序的題目--輸出所有可能的拓撲排序--按字典序
/*

具體思路 :
1. 讀入數據,用used[]記錄那些字符被使用過,并將字符hash到
   從小到大的數字cnt,用mymap[]數組來將數字hash回相應的字符
2. 尋找矩形框--找到每種字符最大和最小的行列,存放在node[]數組中

3. 構建圖形edge[][]--掃描輸入,對于每個字母,按照矩形框掃描四個邊
   如果掃描到不相同的字母,建立一條有向邊,edge[][]=1
4. DFS_Topsort()--對于已經建立好的有向邊利用深度優先搜索排序
5. 輸出所有的拓撲序列
*/
#include 
<stdio.h>
#include 
<stdlib.h>
#include 
<string.h>
#include 
<ctype.h>
#include 
<math.h>

#define unllong unsigned long long 
#define unint unsigned int
#define printline  printf( "\n" ) 
typedef 
long long llong ;
//const double PI = 2.0 * acos( 0.0 ) ;

const int Base=1000000000;
const int Capacity=100;
const int INF = 1000000 ;
const int size = 35 ;

struct NODE
{
    
int minr, minc ;
    
int maxr, maxc ;
};
struct NODE node[28] ;

char data[size][size] ;

int used[200] ;//把字符映射成數字
char mymap[200] ;//把數字映射成字符
int cnt ;//記錄映射的最大數字--圖的最大頂點標號

int edge[30][30] ;//構建有向圖
int indeg[30] ;//記錄所有的點的入度

int row, col ;

char topout[30] ;//暫存生成的拓撲序列

struct OUT 
{
    
char str[30] ;
};
struct OUT out[20000] ;
int ct_out ;

int fmax( int a, int b )
{
    
if( a > b )    return a ;
    
else        return b ;
}

int fmin( int a, int b )
{
    
if( a < b )    return a ;
    
else        return b ;
}

void input()
{
    memset( used, 
0sizeof(used) ) ;
    memset( mymap, 
0sizeof(mymap) ) ;
    memset( indeg, 
0sizeof(indeg) ) ;
    memset( edge, 
0sizeof(edge) ) ;

    cnt 
= 1 ;
    
forint i=0; i<row; i++ ) { 
        scanf( 
"%s", data[i] ) ;
        
forint j=0; j<col; j++ ) {
            
if'.' == data[i][j] ) continue ;
            
if( used[data[i][j]] )    continue ;
            used[data[i][j]] 
= cnt ; mymap[cnt++= data[i][j] ;
        }
//建立相互映射
    }

    
forint i=0; i<=26; i++ ) {
        node[i].minr 
= node[i].minc = INF ;
        node[i].maxr 
= node[i].maxc = -1 ;
    }
//初始化每個字母的最小最大行列
}

void find_degree()
{
    
forint i=1; i<cnt; i++ )
        
forint j=1; j<cnt; j++ )    
            indeg[i] 
+= edge[j][i] ;
}

void DFS_Topsort( int sn, int tdep )
{
    
int back[30] ;//深搜的用于暫存狀態的數組
    forint i=1; i<cnt; i++ ) back[i] = indeg[i] ;

    
if( sn == tdep )
    {
        
//printf( "=======%s\n", topout ) ;
        strcpy( out[ct_out].str, topout ) ;
        ct_out
++ ;
        
return ;
    }
    
forint i=1; i<cnt; i++ )
    {
        
if0 == indeg[i] ) { 
            topout[sn] 
= mymap[i] ; indeg[i] = -1 ; 
            
forint k=1; k<cnt; k++ ) 
                
if( edge[i][k] ) indeg[k]-- ;//入度減1

            DFS_Topsort( sn
+1, tdep ) ;

            
forint k=1; k<cnt; k++ ) indeg[k] = back[k] ;
        }
    }
}

void find_edge( int curn )
{
//對四個邊進行查找--尋找矩形框
    int minr = node[curn].minr ; int minc = node[curn].minc ;
    
int maxr = node[curn].maxr ; int maxc = node[curn].maxc ;

    
int nodex, nodey ; nodey = used[curn+'A'] ;
    
forint k=minc; k<=maxc; k++ )
    {
        
if( data[minr][k]!='.'&&data[minr][k]!=curn+'A' ) {
            nodex 
= used[data[minr][k]] ; edge[nodey][nodex] = 1 ;
        }
        
if( data[maxr][k]!='.'&&data[maxr][k]!=curn+'A' ) {
            nodex 
= used[data[maxr][k]] ; edge[nodey][nodex] = 1 ;
        }
    }
    
forint k=minr; k<=maxr; k++ )
    {
        
if( data[k][minc]!='.'&&data[k][minc]!=curn+'A' ) {
            nodex 
= used[data[k][minc]] ; edge[nodey][nodex] = 1 ;
        }
        
if( data[k][maxc]!='.'&&data[k][maxc]!=curn+'A' ) {
            nodex 
= used[data[k][maxc]] ; edge[nodey][nodex] = 1 ;
        }
    }
}

void build_graph()
{
    
forint i=0; i<row; i++ ) {
        
forint j=0; j<col; j++ ) {
            
if'.' == data[i][j] )    continue ;
            find_edge( data[i][j] 
- 'A' ) ;
        }
    }
    
forint i=1; i<cnt; i++ ) edge[i][i] = 0 ;
}

void process()
{
    
int curnode ;
    
forint i=0; i<row; i++ ) {
        
forint j=0; j<col; j++ ) {
            
if( data[i][j] != '.' ) {
                curnode 
= data[i][j] - 'A' ;
                node[curnode].minr 
= fmin( node[curnode].minr, i ) ;
                node[curnode].minc 
= fmin( node[curnode].minc, j ) ;
                node[curnode].maxr 
= fmax( node[curnode].maxr, i ) ;
                node[curnode].maxc 
= fmax( node[curnode].maxc, j ) ;
            }
        }
    }
//尋找每個字母的矩形框

    build_graph() ; 
//建圖

    find_degree() ;
//計算入度

    ct_out 
= 0 ;
    DFS_Topsort( 
0, cnt-1 ) ;//拓撲排序
}

int cmp( const void *a, const void *b )
{
    
struct OUT *= (struct OUT *)a ;
    
struct OUT *= (struct OUT *)b ;

    
return strcmp( c->str, d->str ) ;
}

void output()
{
    qsort( 
out, ct_out, sizeof(out[1]), cmp ) ;

    
forint i=0; i<ct_out; i++ )
    {
        printf( 
"%s\n"out[i].str ) ;
    }
}

int main()
{
    freopen( 
"frameup.in""r", stdin ) ;
    freopen( 
"frameup.out","w",stdout ) ;

    
//freopen( "in.txt", "r", stdin ) ;

    
while( scanf( "%d %d"&row, &col ) != EOF )
    {
        input() ;

        process() ;

        output() ;
    }
    
return 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>
            欧美精品日本| 国产一区视频在线看| 欧美人与性动交a欧美精品| 国产亚洲欧美色| 亚洲欧美另类国产| 亚洲日本理论电影| 久久综合伊人| 1000部国产精品成人观看| 久久久精彩视频| 欧美影院一区| 狠狠色丁香婷婷综合久久片| 欧美一区二区三区日韩| 亚洲综合二区| 国产在线拍偷自揄拍精品| 久久成人av少妇免费| 午夜宅男久久久| 国产自产女人91一区在线观看| 午夜日韩激情| 欧美影院一区| 亚洲国产美女| 亚洲精品国产精品国产自| 欧美日韩99| 亚洲欧美国产一区二区三区| 亚洲天堂免费观看| 国产嫩草影院久久久久| 久久精品国产久精国产一老狼| 性做久久久久久| 亚洲高清中文字幕| 亚洲国产一区二区三区高清| 欧美日韩国语| 欧美伊人久久久久久午夜久久久久| 午夜精品久久久久| 影音先锋久久资源网| 亚洲国产高清一区| 国产精品卡一卡二卡三| 久久久噜噜噜久久久| 欧美成人精品高清在线播放| 亚洲网址在线| 亚洲免费在线| 欧美一级久久久| 亚洲黄色一区| 国产精品99久久久久久宅男| 国产亚洲欧美激情| 亚洲电影在线免费观看| 国产精品第三页| 蜜桃av久久久亚洲精品| 欧美日韩精品一区视频| 久久久国产91| 欧美日韩福利在线观看| 久久久久国产精品一区二区| 欧美激情亚洲自拍| 久久久99国产精品免费| 欧美日韩久久久久久| 久久久欧美一区二区| 欧美精品一区二区三区蜜桃| 久久激情视频久久| 欧美日韩亚洲一区二区三区四区 | 亚洲视频一区| 久久精品三级| 亚洲欧美日韩直播| 欧美国产在线视频| 久久午夜电影| 国产精品美女视频网站| 亚洲国产精品激情在线观看| 国产亚洲网站| 亚洲午夜女主播在线直播| 亚洲精品乱码久久久久久按摩观| 欧美亚洲三区| 亚洲欧美日韩一区二区在线| 欧美精品播放| 欧美不卡在线视频| 韩日成人av| 午夜精品福利在线观看| 亚洲午夜久久久久久久久电影院| 久久另类ts人妖一区二区| 亚洲一区三区视频在线观看| 欧美v国产在线一区二区三区| 久久久久久久999精品视频| 欧美日韩在线直播| 亚洲人屁股眼子交8| 亚洲国产天堂久久综合网| 亚洲欧美日韩国产一区二区三区| 宅男精品视频| 欧美日韩国产a| 亚洲激情另类| 日韩视频免费观看高清在线视频 | 亚洲精选在线| 免费亚洲视频| 欧美韩国在线| 亚洲欧洲一区二区在线观看| 久久精品理论片| 久久精品国产亚洲aⅴ| 国产精品入口66mio| 亚洲图中文字幕| 性欧美超级视频| 国产精品影音先锋| 亚洲欧美资源在线| 欧美在线播放一区二区| 国产日韩av在线播放| 性8sex亚洲区入口| 久久一区国产| 亚洲国产欧美一区二区三区久久| 久久精品网址| 99精品国产一区二区青青牛奶| 久久婷婷国产麻豆91天堂| 国产日韩欧美在线一区| 亚洲欧美一区二区视频| 久久精品99| 在线观看成人小视频| 美腿丝袜亚洲色图| 亚洲巨乳在线| 性欧美超级视频| 国产一区欧美| 免费观看在线综合色| 亚洲欧洲综合另类| 亚洲综合欧美日韩| 欧美精品成人91久久久久久久| 亚洲国产毛片完整版| 亚洲视频你懂的| 国产欧美精品在线播放| 久久久久国产精品厨房| 亚洲激情在线观看| 欧美在线一区二区三区| 亚洲国产综合在线| 国产精品你懂的| 美女久久一区| 亚洲一二三区精品| 欧美www视频| 亚洲一区三区视频在线观看| 韩国久久久久| 国产精品ⅴa在线观看h| 久久爱www久久做| 亚洲精品在线观看视频| 久久先锋资源| 亚洲欧美日韩天堂一区二区| 在线看日韩欧美| 国产精品毛片a∨一区二区三区|国| 久久久久九九九| 国产精品99久久久久久久久| 欧美电影免费观看大全| 午夜欧美大尺度福利影院在线看| 亚洲国产精品久久久久秋霞蜜臀| 国产精品国产精品| 欧美成人一区二免费视频软件| 午夜精品短视频| 亚洲理论电影网| 欧美成人免费在线观看| 欧美亚洲日本网站| 亚洲素人一区二区| 亚洲精品自在久久| 在线播放日韩| 国产亚洲激情视频在线| 欧美性做爰猛烈叫床潮| 欧美高清hd18日本| 开元免费观看欧美电视剧网站| 亚洲女同在线| 中日韩在线视频| 最新成人在线| 欧美国产一区二区| 久久在线91| 久久精品国产清自在天天线| 亚洲欧美日韩国产中文在线| 一区二区高清视频| 日韩写真在线| 亚洲精品中文字幕女同| 91久久综合| 亚洲欧洲精品一区二区| 亚洲国产岛国毛片在线| 精品999在线播放| 国产在线观看精品一区二区三区| 国产精品专区h在线观看| 国产精品日韩精品| 国产精品一区在线观看你懂的| 国产精品免费aⅴ片在线观看| 欧美丝袜第一区| 国产精品成人观看视频免费| 欧美视频一区二区| 国产精品欧美日韩| 一级日韩一区在线观看| 亚洲免费播放| 一区二区高清| 亚洲午夜黄色| 亚洲免费视频网站| 性欧美8khd高清极品| 久久xxxx精品视频| 久久蜜桃精品| 欧美激情在线| 欧美三级电影一区| 国产精品久久91| 国产欧美一区二区三区沐欲 | 亚洲乱码国产乱码精品精可以看| 亚洲精品日产精品乱码不卡| 日韩视频在线观看免费| 一区二区三区蜜桃网| 亚洲视屏在线播放| 久久国产黑丝| 亚洲国产精品久久久久婷婷884 | 亚洲欧美激情四射在线日 | 久久亚洲精品中文字幕冲田杏梨| 久久久久9999亚洲精品|