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

我希望你是我獨家記憶

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

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

Posted on 2008-08-16 23:02 Hero 閱讀(194) 評論(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>
            一区在线视频观看| 男女激情久久| 午夜亚洲影视| 欧美一区二区女人| 亚洲第一久久影院| 最新69国产成人精品视频免费| 亚洲欧洲一区二区三区在线观看| 欧美成人午夜激情在线| 亚洲一区欧美二区| 久久爱另类一区二区小说| 欧美+日本+国产+在线a∨观看| 欧美日韩一区成人| 国产亚洲午夜| 亚洲小说春色综合另类电影| 久久综合九色99| 中日韩午夜理伦电影免费| 狂野欧美激情性xxxx| 国产一区二三区| 性欧美暴力猛交69hd| 久久激情综合网| 亚洲激情综合| 欧美承认网站| 欧美视频在线视频| 99精品黄色片免费大全| 乱人伦精品视频在线观看| 亚洲欧美影音先锋| 欧美日韩在线视频观看| 久久精品国产久精国产思思| 99国产精品视频免费观看| 久久欧美中文字幕| 影音先锋在线一区| 99国产一区| 黄网站免费久久| 妖精成人www高清在线观看| 国产日韩视频| 久久精品在线观看| 亚洲欧美bt| 国产偷国产偷亚洲高清97cao| 亚洲福利视频一区| 国产农村妇女精品一二区| 亚洲欧美日韩一区二区在线| 在线一区二区三区四区| 亚洲国产老妈| 午夜精品久久久久久99热| 一本色道久久综合亚洲精品小说| 欧美高清视频www夜色资源网| 国产精品久久久久久久久搜平片 | 欧美日韩123| 一本久久综合| 久久日韩粉嫩一区二区三区| 午夜国产精品视频免费体验区| 亚洲欧美在线x视频| 亚洲午夜视频在线| 欧美激情影院| 亚洲私人影吧| 欧美伊人久久久久久久久影院| 激情伊人五月天久久综合| 亚洲一区二区三区视频播放| 9久re热视频在线精品| 欧美成人精品一区二区| 一区二区三区毛片| 亚洲一区二区三区激情| 亚洲一区在线视频| 欧美亚洲在线观看| 亚洲人成在线播放网站岛国| 久久夜色精品亚洲噜噜国产mv| 久久精品99| 国产日韩欧美日韩| 欧美亚洲一级| 老司机aⅴ在线精品导航| 国产字幕视频一区二区| 欧美一区二区女人| 久久久综合香蕉尹人综合网| 欧美电影在线播放| 亚洲精品国产精品国自产在线| 欧美深夜福利| 亚洲午夜三级在线| 亚洲欧洲在线看| 欧美1区2区| 亚洲九九精品| 亚洲国产一区二区a毛片| 久热精品视频在线观看| 亚洲国产cao| 一区二区三区欧美| 欧美午夜精彩| 最新热久久免费视频| 在线观看国产一区二区| 欧美成人免费在线观看| 日韩网站在线看片你懂的| 激情久久综合| 欧美jizz19性欧美| 亚洲视频福利| 久久综合精品国产一区二区三区| 亚洲人成在线观看| 欧美日韩成人在线视频| 亚洲欧美一区二区激情| 欧美aa国产视频| 亚洲一区国产| 亚洲春色另类小说| 久久精品在线| 久久精彩视频| 亚洲美女av网站| 蜜桃久久av一区| 另类国产ts人妖高潮视频| 日韩天堂av| 国产三区精品| 欧美日本在线播放| 亚洲精选在线| 榴莲视频成人在线观看| 亚洲午夜一区| 亚洲黄色性网站| 国产伦精品一区二区三区四区免费 | 国产女主播一区二区| 免费久久精品视频| 亚洲男人的天堂在线观看| 亚洲国产精品va在看黑人| 亚洲国产精品成人精品 | 你懂的国产精品| 性色一区二区| 日韩一级在线| 最新日韩精品| 黄色一区二区三区| 国产麻豆综合| 欧美午夜一区| 欧美激情bt| 一本色道久久综合| 香蕉久久夜色精品国产| 一本色道久久99精品综合 | 国产毛片一区| 欧美三日本三级三级在线播放| 久久亚洲春色中文字幕久久久| 亚洲男同1069视频| 一本一道久久综合狠狠老精东影业 | 99这里只有精品| 亚洲国产精品精华液网站| 国内精品久久久| 国产一区二区三区黄| 国产日韩欧美二区| 国产欧美69| 国产美女精品视频| 国产精品一区二区女厕厕| 国产精品婷婷| 久色成人在线| 久久综合影视| 免费久久久一本精品久久区| 久久综合一区| 欧美成人免费网站| 欧美国产亚洲精品久久久8v| 欧美1区视频| 欧美激情在线狂野欧美精品| 欧美大成色www永久网站婷| 欧美激情精品久久久久久变态| 欧美h视频在线| 欧美女主播在线| 欧美日产国产成人免费图片| 欧美日韩和欧美的一区二区| 欧美日韩一区二区三区四区在线观看| 欧美日韩在线三级| 国产精品午夜春色av| 国产综合自拍| 亚洲国产婷婷综合在线精品| 日韩亚洲一区在线播放| 亚洲网站在线观看| 欧美亚洲一区二区在线| 久久精品噜噜噜成人av农村| 另类av一区二区| 亚洲国产一区视频| 亚洲免费久久| 香蕉久久夜色精品| 中日韩男男gay无套| 欧美一区二区三区四区在线观看地址| 欧美亚洲免费电影| 欧美+亚洲+精品+三区| 欧美视频日韩视频在线观看| 国产综合av| 亚洲精品久久久久久久久久久久久 | 欧美日韩午夜剧场| 国产日产欧美一区| 亚洲精品国产日韩| 亚洲欧美另类中文字幕| 久久中文精品| 一本久道久久综合婷婷鲸鱼| 欧美一区二区在线播放| 欧美国产视频一区二区| 国产精品亚发布| 亚洲精品视频免费在线观看| 欧美一区午夜精品| 亚洲激情综合| 欧美一区二区三区在线观看视频| 欧美精品网站| 狠狠v欧美v日韩v亚洲ⅴ| 国内精品久久久| 在线视频欧美日韩| 米奇777超碰欧美日韩亚洲| 欧美资源在线| 久久久www成人免费精品| 亚洲区国产区| 久久免费视频这里只有精品| 国产精品盗摄久久久| 国产精品久久久久久亚洲毛片|