专题四 Problem J

一、题目编号:
          1010
二、简单题意:
       Jimmy一最近在工作上感觉很大的压力,为了放松,他决定要从树林一端穿到另一端回家,因为树林中的环境非常漂亮。办公室是起点,为1,终点是家为2,要求: 每次到达新点一定是更加接近终点,问有多少种路径
三、解题思路形成过程
     开始用dijkstra算法求出所有点到终点的最短距离,然后用深搜搜索求出路径个数。
四、感想
     思路想清楚,主要是利用了dijkstra算法和之前专题练习的深搜,这个题目相对之前做的就比较综合了。
五、AC代码
#include<stdio.h>
#include<string.h>
#include<queue>
#define INF 0x1f1f1f
using namespace std;
int head[1002];
struct node
{
    int to,w,next;
}q[3000002];
struct node2
{
    int xu,di;
    bool operator < (node2 t)const
    {
        return t.di<di;
    }
}tt,in;
int tot;
int n,sum;
void add(int s,int t,int wi)
{
    q[tot].to=t;
    q[tot].next=head[s];
    q[tot].w=wi;
    head[s]=tot++;
}
int d[1002];
void dijkstra(int v)
{
    priority_queue<node2>dis;
    int i;
    in.xu=v;
    in.di=0;
    d[v]=0;
    dis.push(in);
    while(!dis.empty())
    {
        tt=dis.top();
        if(tt.xu==1)break;
        dis.pop();
        for(i=head[tt.xu];i;i=q[i].next)
        {
            in.xu=q[i].to;
            in.di=tt.di+q[i].w;
            if(in.di<d[in.xu])
            {
                d[in.xu]=in.di;
                dis.push(in);
            }
        }

    }
}
int j[1002];
int dfs(int r)
{
    int i,k=0;
    if(j[r]!=-1)
        return j[r];
    for(i=head[r];i;i=q[i].next)
        if(d[q[i].to]<d[r])
            k+=dfs(q[i].to);
    return j[r]=k;
}
int main()
{
    int i,m,a,b,w;
    while(scanf("%d",&n),n)
    {
        scanf("%d",&m);
        tot=1;
        memset(j,-1,sizeof(j));
        memset(head,0,sizeof(head));
        memset(d,INF,sizeof(d));
        while(m--)
        {
            scanf("%d%d%d",&a,&b,&w);
            add(a,b,w);
            add(b,a,w);
        }
        dijkstra(2);
        j[2]=1;
        printf("%d\n",dfs(1));
    }
    return 0;
}

你可能感兴趣的:(专题四 Problem J)