一、题目编号:
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;
}