【图论】A Walk Through…

来源:互联网 发布:淘宝手机营销中心 编辑:程序博客网 时间:2024/06/05 14:59

A Walk Through the Forest

TimeLimit: 2000/1000 MS(Java/Others)    MemoryLimit: 65536/32768 K (Java/Others)
Total Submission(s):6027    AcceptedSubmission(s): 2228


Problem Description
Jimmy experiences a lot of stress at work these days, especiallysince his accident made working difficult. To relax after a hardday, he likes to walk home. To make things even nicer, his officeis on one side of a forest, and his house is on the other. A nicewalk through the forest, seeing the birds and chipmunks is quiteenjoyable. 
The forest is beautiful, and Jimmy wants to take a different routeeveryday. He also wants to get home before dark, so he always takesa path to make progress towards his house. He considers taking apath from A to B to be progress if there exists a route from B tohis home that is shorter than any possible route from A. Calculatehow many different routes through the forest Jimmy mighttake. 
 

Input
Input contains several test cases followed by a line containing 0.Jimmy has numbered each intersection or joining of paths startingwith 1. His office is numbered 1, and his house is numbered 2. Thefirst line of each test case gives the number of intersections N, 1< N ≤ 1000, and the number of paths M. The following M lineseach contain a pair of intersections a b and an integer distance 1≤ d ≤ 1000000 indicating a path of length d between intersection aand a different intersection b. Jimmy may walk a path any directionhe chooses. There is at most one path between any pair ofintersections. 
 

Output
For each test case, output a single integer indicating the numberof different routes through the forest. You may assume that thisnumber does not exceed 2147483647

Sample Input
5 6 13 2 1 4 2 3 4 3 1 5 12 4 2 34 5 2 24 7 8 1 3 1 1 4 1 3 7 1 7 4 1 75 1 6 7 1 5 2 1 6 2 1 0
 

Sample Output
24



先用SPFA以2为起点算出对每个点的最短路。
再用深搜从2开始遍历,算出每个点到终点的路径数量。

#include

#include

using namespace std;


int a[1100][1100];

int q[110000];

int d[1100];

boolmark[1100];

intsum[1100];

intn;


intdfs(intx)

{

    if(x == 2)return1;

    if(sum[x] != -1)returnsum[x];

    into = 0;

    for(inti = 0;i <= n;i++)

       if(a[x][i]>0)

          if(d[x] > d[i])

              o += dfs(i);

    sum[x] = o;

    returno;

}


intmain()

{

    while(1)

    {

       scanf("%d",&n);

       if(n == 0)break;

       intm;

       scanf("%d",&m);

       for(inti = 0;i <= n;i++)

          for(intj = 0;j <= n; j++)

              a[i][j] = 0;

       for(inti = 0;i < m; i++)

       {

          intx, y, z;

          scanf("%d%d %d", &x, &y, &z);

           a[x][y] =z;

           a[y][x] =z;

       }

       

       for(inti = 1;i <= n; i++) mark[i] = 0;

       for(inti = 1;i <= n; i++) d[i] = -1;

       inthead = 0;

       inttail = 1;

       q[0]= 2;

       mark[2]= 1;

       d[2]= 0;

       while(head != tail)

       {

          intx = q[head];

          for(inti = 1;i <= n;i++)

              if(a[x][i]>0)

                 if(d[i]== -1|| d[i]> d[x]+ a[x][i])

                 {

                    d[i]= d[x]+ a[x][i];

                    if(!mark[i])

                     {

                        mark[i]= 1;

                        q[tail]= i;

                        tail++;

                     }

                 }

          head++;

          mark[x]= 0;

       }

       

       for(inti = 1;i <= n;i++)

          sum[i]= -1;

       

       printf("%d\n",dfs(1));

    }

}


0 0
原创粉丝点击