我希望你是我独家记忆

一段永远封存的记忆,随风而去
posts - 263, comments - 31, trackbacks - 0, articles - 3
   :: 首页 :: 新随笔 ::  :: 聚合  :: 管理

P1716

Posted on 2008-09-07 13:30 Hero 阅读(91) 评论(0)  编辑 收藏 引用 所属分类: 代码如诗--ACM
//1716 Accepted 880K 0MS C++ 2474B PKU

#include 
<stdio.h>
#include 
<string.h>
#include 
<stdlib.h>

const int INF = 100000000 ;
const int size = 11000 ;

struct NODE 
{
    
int en ;
    
int len ;
    
int next ;
};

struct NODE nhead[size*100] ;
int chead ;

int dist[size+100] ;
int visit[size+100] ;
int que[size*20] ;  
int head, tail ;

int inmax ;
int inn ;

void input()
{
    
int sn, en ; int len = 2 ; inmax = -1 ; chead = size ;

    
forint i=0; i<size; i++ ) nhead[i].next = -1 ;

    
forint i=1; i<=inn; i++ )
    {
        scanf( 
"%d %d"&sn, &en ) ; sn++ ; en++ ; en++ ;
        
if( inmax < en )    inmax = en ;

        nhead[sn].len
++ ; nhead[chead].next = nhead[sn].next ; nhead[sn].next = chead ;
        nhead[chead].en 
= en ; nhead[chead].len = -2 ; chead++ ;
    }

    
forint i=1; i<=inmax; i++ )
    {
        sn 
= i ; en = i-1 ;
        nhead[sn].len
++ ; nhead[chead].next = nhead[sn].next ; nhead[sn].next = chead ;
        nhead[chead].en 
= en ; nhead[chead].len = 1 ; chead++ ;

        sn 
= i-1; en = i ;
        nhead[sn].len
++ ; nhead[chead].next = nhead[sn].next ; nhead[sn].next = chead ;
        nhead[chead].en 
= en ; nhead[chead].len = 0 ; chead++ ;
    }

    
forint i=1; i<=inmax; i++ )
    {
        nhead[
0].len++ ; nhead[chead].next = nhead[0].next; nhead[0].next = chead ;
        nhead[chead].en 
= i ; nhead[chead].len = 0 ; chead++ ;
    }
/*
    for( int i=0; i<=inmax; i++ )
    {
        printf( "head[%d]==%d", i, i ) ;
        for( int p=nhead[i].next; p!=-1; p=nhead[p].next )
            printf( " %4d ", nhead[p].en ) ;
        printf( "\n" ) ;
    }
*/
}

void SPFA( int sn, int n )
{
    
for(int i=0; i<=n; i++
    {
        dist[i] 
= INF ; visit[i] = 0 ;
    }
    tail 
= 0 ; que[++tail] = sn ; dist[sn] = 0 ; visit[sn] = 1 ;

    
int cursn = 100 ;

    
while( tail > 0 )
    {
        cursn 
= que[tail--] ; visit[cursn] = 0 ;
        
forint p=nhead[cursn].next ; p!=-1; p=nhead[p].next )
        {
            
if( dist[nhead[p].en] > dist[cursn] + nhead[p].len )
            {
                dist[nhead[p].en] 
= dist[cursn] + nhead[p].len ;
                
if0 == visit[nhead[p].en] )
                {
                    visit[nhead[p].en] 
= 1 ; que[++tail] = nhead[p].en ;
                }
            }
        }
    }
}


void process()
{
    SPFA( 
0, inmax ) ;

    
//for( int i=0; i<=inmax; i++ ) printf( "dist[%d]===%d\n", i, dist[i] ) ;

    printf( 
"%d\n"0-dist[inmax] ) ;
}

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

    
while( scanf( "%d"&inn ) != EOF )
    {
        input() ;

        process() ;

        
//output() ;
    }

    
return 0 ;
}

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理