zoukankan      html  css  js  c++  java
  • CF Planets(STL+ 最短路)

    在CF上做了两场比赛,又在ural上尝试做了几道题,最后还是决定以后的训练还是主要集中在CF上吧,是时候把学的知识融合一下了,而且在POJ上总是会习惯的去看discuss里的讨论,不会自己认真去想,应该换个地方练练了。不过貌似有点“出师不利”啊,昨天做了一道题,WA了整整一版也没过,最后终于想不出是哪里错了,参考了一下别人的代码,结果他们都是用STL做的,思路都一样,SPFA求最短路。于是改用STL做了一下,开始初始化小了,WA了一次就过了,然后改用二维数组又写了一遍,还是过不了第66个样例,不知道怎么办了,应该是第66的样例中有时间延迟数据很多的,我开的数组不要够大,但是二维数组不能再开大,要不就超内存了,所以还是用STL做吧。

    代码:

    View Code
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <iostream>
    #include <algorithm>
    #include <queue>
    #include <math.h>
    #include <set>
    #include <vector>
    #define  N 100005
    //#define  INF  1<<63
    using namespace std ;
    
    //typedef long long ll ;
    const int INF =(1 << 30)  ;
    
    vector<int>p[N] ;
    vector<int>val[N] ;
    set<int>tp[N] ;
    int dis[N] ;
    int n , m ;
    bool vist[N] ;
    
    int main()
    {
        int i , x , y , z;
        //cout<<INF<<endl;
        while ( scanf ( "%d%d" , &n, &m ) != EOF )
        {
    
            for ( i = 1 ; i <= m ; i++ )
            {
                scanf ( "%d%d%d" , &x , &y , &z ) ;
                p[x].push_back( y ) ; val[x].push_back( z ) ;
                p[y].push_back( x ) ; val[y].push_back( z ) ;
            }
    
            //set<int>tp[N] ;
            for ( i = 1 ; i <= n ; i++ )
            {
                tp[i].clear();
                scanf ( "%d" , &x ) ;
                while ( x-- )
                {
                    scanf ( "%d" , &y ) ;
                    tp[i].insert( y ) ;
                }
            }
    
            for ( i = 0 ; i <= n ; i++ )
            {
                dis[i] = INF ;
                vist[i] = false ;
            }
            queue<int>q ;
            dis[1] = 0 ;vist[1] = true ;
            q.push( 1 ) ;
    
            while ( !q.empty())
            {
                x = q.front() ;
                q.pop();
                vist[x] = false ;
                y = dis[x] ;
                while ( tp[x].count( y )) y++ ;
                for ( i = 0 ; i < p[x].size() ; i++ )
                {
                    z = p[x][i] ;
                    int t = val[x][i] ;
                    if ( dis[z] > y + t )
                    {
                        dis[z] = y + t ;
                        if ( !vist[z] )
                        {
                            vist[z] = true ;
                            q.push( z ) ;
                        }
                    }
                }
            }
            for( i = 1 ; i <= n ; i++ )
            {
                p[i].clear();
                val[i].clear();
            }
            if ( dis[n] == dis[0] )
            dis[n] = -1 ;
            printf ( "%d\n" , dis[n] ) ;
        }
        return 0 ;
    }
  • 相关阅读:
    hdu 5119 Happy Matt Friends
    hdu 5128 The E-pang Palace
    hdu 5131 Song Jiang's rank list
    hdu 5135 Little Zu Chongzhi's Triangles
    hdu 5137 How Many Maos Does the Guanxi Worth
    hdu 5122 K.Bro Sorting
    Human Gene Functions
    Palindrome(最长公共子序列)
    A Simple problem
    Alignment ( 最长上升(下降)子序列 )
  • 原文地址:https://www.cnblogs.com/misty1/p/2745357.html
Copyright © 2011-2022 走看看