zoukankan      html  css  js  c++  java
  • zoj 2923 Calculate Roads

    Calculate Roads

    Time Limit: 5 Seconds      Memory Limit: 32768 KB

    Little Vitta needs to go from home to school every day. On her way to school, there are n crossing and m roads in total. Because of lazy, she often gets up late in the morning. In order to get to school on time, she wishes that she can always go to school in the shortest path.(Assume that the time cost on every road is 1. And all roads are bidirectional. That is to say, if she can go from A to B, she always can go from B to A). But on some specific crossings, there are some terrible insects which makes Vitta scared. She expects the crossings which has insects don't exceed k. She wants know the number of all possible paths, can you help her?

    Input

    We assume Vitta's home is node 1, and the school is node n.

    For each case, there are 3 integers in first line, m n k(m <= 1000000, n <= 5000, k <= 50), as the problem statement says.

    In the following n lines, every line contains 2 integer x and y. y equals 1 means node x has terrible insects else if y equals 0 means there is no insect.

    In the following m lines, every line contains 2 integer p and q, which means node p and node q is linked.

    Output

    For each case, output contains only 1 line.

    If the path satisfies the requirement exists, you only need to output the numbers of paths. If not, you should output "Impossible!"

    Sample Input

    11 8 1
    1 0
    2 1
    3 0
    4 0
    5 1
    6 1
    7 0
    8 0
    1 2
    1 3
    1 4
    2 5
    2 6
    3 5
    3 7
    4 6
    5 8
    6 8
    7 8

    Sample Output

    3

    Hint To Sample

    3 possible paths are 1-3-5-8 1-4-6-8 1-3-7-8


    Tester: YANG, Kete

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<queue>
    #define maxn 10007
    #define MAX 2000010
    #define INF 20000000
    using namespace std;
    
    int  head[maxn] , to[MAX] , next1[MAX] ;
    int val[maxn] ,dis[maxn];
    int k , n ,num[maxn][53] ,top ;
    bool vi[maxn] ;
    int bfs( int s ,int e )
    {
        int i , j , u ,v ,ll ;
          memset(num,0,sizeof(num)) ;
          memset(vi,0,sizeof(vi)) ;
        for( i = 1 ; i <= n ;i++ )
            dis[i] = INF ;
          vi[s] = true ;
        num[s][val[s]] = 1 ;
        dis[s] = 0 ;
        queue<int>q ;
        q.push(s) ;
        while(!q.empty())
        {
            u = q.front();q.pop() ;
            for( j = 0 ; j <= k ;j++ ){
              for( i  = head[u] ; i != -1 ; i = next1[i])
            {
                v = to[i] ;
                ll = val[v]+j ;
                if(dis[v] < dis[u]+1) continue ;
                 dis[v]=dis[u]+1;
                num[v][ll] += num[u][j] ;
                if(!vi[v])q.push(v),vi[v] = true ;
            }
         }
        }
        u = 0 ;
        for( i = 0 ; i <= k;i++){
            u += num[e][i] ;
        }
        return u ;
    }
    void Unit( int u ,int v )
    {
        next1[top] = head[u] ;to[top] = v ;
        head[u] = top++ ;
    }
    int main()
    {
       int i ,m ,u,v ;
       while( scanf("%d%d%d",&m,&n,&k) != EOF )
       {
           memset(head,-1,sizeof(head)) ;
           top = 0 ;
           for( i = 1 ; i <= n ;i++)
           {
               scanf("%d%d",&u,&v) ;
               val[u] = v;
           }
           while(m--)
           {
               scanf("%d%d",&u,&v) ;
               Unit(u,v) ;
               Unit(v,u) ;
           }
           m = bfs(1,n) ;
           if(!m)
              puts( "Impossible!" );
           else
           printf("%d
    ",m);
       }
       return 0 ;
    }
    
  • 相关阅读:
    学习 Linux 几点忠告【转载】
    游侠更新仙剑全系列免CD补丁(支持WIN7 SP1)【转载】
    更改数据库对象所有者
    数据库 行列相互转化
    JQuery计时器
    js操作cookies
    利用自定义DataTable来重画数据集的用法
    asp.net mvc 从客户端中检测到有潜在危险的 Request.Form 值的解决方法
    CS144 Lab
    CS231n Assignment #2
  • 原文地址:https://www.cnblogs.com/20120125llcai/p/3629761.html
Copyright © 2011-2022 走看看