POJ 1135 Domino Effect

POJ 1135 Domino Effect
最终的骨牌要么是关键点,要么是两个关键点中间的两个点。先求最短路,然后求出每条边上的骨牌完全倒下的时间。
以下是我的代码:
#include < algorithm >
#include
< cstdio >
using   namespace  std;
const   int  kMaxn( 507 );
const   int  kInf( 0x7f7f7f7f );

int  n,m,g[kMaxn][kMaxn];
int  d[kMaxn];

void  Dijkstra()
{
    
bool  visited[kMaxn] = { false };
    
for ( int  i = 1 ;i <= n;i ++ )
        d[i]
= (i == 1 ? 0 :kInf);
    
for ( int  i = 1 ;i <= n;i ++ )
    {
        
int  p( - 1 );
        
for ( int  j = 1 ;j <= n;j ++ )
            
if ( ! visited[j]  &&  (p < 0   ||  d[p] > d[j]))
                p
= j;
        visited[p]
= true ;
        
for ( int  j = 1 ;j <= n;j ++ )
            
if ( ! visited[j]  &&  g[p][j] < kInf  &&  d[j] > d[p] + g[p][j])
                d[j]
= d[p] + g[p][j];
    }
}

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

    
int  T( 0 );
    
while (scanf( " %d%d " , & n, & m) == 2   &&  (n  ||  m))
    {
        
for ( int  i = 1 ;i <= n;i ++ )
            
for ( int  j = 1 ;j <= n;j ++ )
                g[i][j]
= (i == j ? 0 :kInf);
        
for ( int  i = 1 ;i <= m;i ++ )
        {
            
int  u,v,w;
            scanf(
" %d%d%d " , & u, & v, & w);
            g[u][v]
= g[v][u] = w;
        }

        Dijkstra();

        
int  ans1( - kInf),key( 1 );
        
for ( int  i = 1 ;i <= n;i ++ )
            
if (ans1 < d[i])
            {
                ans1
= d[i];
                key
= i;
            }

        
double  ans2( - kInf);
        
int  start,end;
        
for ( int  i = 1 ;i <= n;i ++ )
            
for ( int  j = 1 ;j <= n;j ++ )
                
if (g[i][j] < kInf  &&  ans2 < (d[i] + d[j] + g[i][j]) / 2.0 )
                {
                    ans2
= (d[i] + d[j] + g[i][j]) / 2.0 ;
                    start
= i;
                    end
= j;
                }

        T
++ ;
        printf(
" System #%d\n " ,T);
        
if (ans1 >= ans2)
            printf(
" The last domino falls after %.1f seconds, at key domino %d.\n\n " ,( double )ans1,key);
        
else
            printf(
" The last domino falls after %.1f seconds, between key dominoes %d and %d.\n\n " ,ans2,start,end);
    }

    
return   0 ;
}

你可能感兴趣的:(POJ 1135 Domino Effect)