最短路SPFA+DP+uva10917

来源:互联网 发布:php rbac权限管理系统 编辑:程序博客网 时间:2024/05/30 04:29

Problem C: A Walk Through the Forest

Jimmy experiences a lot of stress at work these days, especially sincehis accident made working difficult. To relax after a hard day, helikes to walk home. To make things even nicer, his office is on oneside of a forest, and his house is on the other. A nice walk throughthe forest, seeing the birds and chipmunks is quite enjoyable.

The forest is beautiful, and Jimmy wants to take a different routeeveryday. He also wants to get home before dark, so he always takes apath to make progress towards his house. He considers taking apath fromA to B to be progress if there existsa route from B to his home that is shorter thanany possible route fromA.Calculate how many different routes through the forest Jimmy might take.

Input

Input contains several test cases followed by a line containing 0.Jimmy has numbered each intersection or joining of paths starting with 1.His office is numbered 1, and his house is numbered 2. Thefirst line of each test case gives the number of intersectionsN,1 < N ≤ 1000, and the number of paths M.The followingM lines each containa pair of intersections a b and an integerdistance1 ≤ d ≤ 1000000 indicating a path of length dbetween intersectiona and a different intersection b.Jimmy may walk a path any direction he chooses.There is at most one path between any pair of intersections.

Output

For each test case, output a single integer indicating the number of different routesthrough the forest. You may assume that this number does notexceed 2147483647.

Sample Input

5 61 3 21 4 23 4 31 5 124 2 345 2 247 81 3 11 4 13 7 17 4 17 5 16 7 15 2 16 2 10

Output for Sample Input

24
思路:从终点求一次最短路,然后记忆话搜索求路径条数。

#include<iostream>#include<cstdio>#include<cstring>#include<vector>#include<cmath>#include<queue>#include<stack>#include<map>#include<set>#include<algorithm>using namespace std;const int maxn=1010;const int INF=1000000000;int n,m,num;int dis[maxn],head[maxn],d[maxn];bool vis[maxn];struct node{    int v,next,f;}edge[maxn*100];void init(){    num=0;    memset(head,-1,sizeof(head));    memset(d,-1,sizeof(d));}void add_edge(int x,int y,int f){    edge[num].v=y;    edge[num].next=head[x];    edge[num].f=f;    head[x]=num++;}void SPFA(int s){    for(int i=0;i<=n;i++)    {        dis[i]=INF;        vis[i]=0;    }    queue<int> q;    q.push(s);    vis[s]=1;    dis[s]=0;    while(!q.empty())    {        int u=q.front();q.pop();        vis[u]=0;        for(int i=head[u];i!=-1;i=edge[i].next)        {            int v=edge[i].v,w=edge[i].f;            if(dis[v]>dis[u]+w)            {                dis[v]=dis[u]+w;                if(!vis[v])                {                    q.push(v);                    vis[v]=1;                }            }        }    }}int DP(int u){    int & ans=d[u];    if(ans!=-1)return d[u];    ans=0;    for(int i=head[u];i!=-1;i=edge[i].next)    {        int v=edge[i].v;        if(dis[v]<dis[u])            ans+=DP(v);    }    return ans;}int main(){    freopen("in.txt","r",stdin);    while(scanf("%d",&n)!=EOF,n)    {        init();        scanf("%d",&m);        while(m--)        {            int a,b,c;            scanf("%d%d%d",&a,&b,&c);            add_edge(a,b,c);            add_edge(b,a,c);        }        SPFA(2);        d[2]=1;        DP(1);        printf("%d\n",d[1]);    }    return 0;}




0 0