记忆化搜索介绍 hdu1078
如果从B到home的路比任何从home到A的路要短,那么久有一条A从到B的路,计算一个可以由几条路
如图
dfs(1)
⑴ A->2,return 1, p[A]+=1 p[1]+=1 ===>p[A]=1 p[1]=1
⑵B->C
->2,return 1,p[C]+=1 ===> p[C]=1
->D,D->2,return 1, p[D]+=1,p[C]+=1 p[B]+=2 ===> p[D]=1 p[C]=2 p[B]=2 p[1]=3
⑶->D,return p[D] p[1]+=1 ===> p[D]=1 p[C]=2 p[B]=2 p[1]=4
#include <iostream>
#include <stdio.h>
#include <vector>
#include <memory.h>
#include <queue>
using namespace std;
const int INF=0x3f3f3f3f;
const int MAXN=1005;
const int MAXM=1000010;
struct node
{
int v;
int c;
node(int _v=0,int _c=0):v(_v),c(_c){}
bool operator <(const node&r)const {
return c>r.c;
}
};
struct Edge
{
int v,cost;
Edge(int _v=0,int _cost=0):v(_v),cost(_cost){}
};
vector<Edge>E[MAXM];
bool vis[MAXN];
int dist[MAXN];
int p[MAXN];
int n,m;
void Dijkdtra(int start)
{
memset(vis,false,sizeof(vis));
memset(dist,0x3f3f3f3f,sizeof(dist));
priority_queue<node>pq;
dist[start]=0;
pq.push(node(start,0));
node tmp;
while(!pq.empty()){
tmp=pq.top();
pq.pop();
int u=tmp.v;
if(vis[u])continue;
vis[u]=true;
for(int i=0;i<E[u].size();i++){
int v=E[u][i].v;
int cost=E[u][i].cost;
if(!vis[v]&&dist[v]>dist[u]+cost){
dist[v]=dist[u]+cost;
pq.push(node(v,dist[v]));
}
}
}
}
void addedge(int u,int v,int w)
{
E[u].push_back(Edge(v,w));
}
int dfs(int u)
{
if(u==2)return 1;
if(p[u])return p[u];
for(int i=0;i<E[u].size();i++){
int v=E[u][i].v;
if(dist[u]>dist[v])p[u]+=dfs(v);
}
return p[u];
}
int main()
{
//freopen("in.txt","r",stdin);
int u,v,w;
while(scanf("%d",&n)&&n){
for(int i=1;i<=n;i++)E[i].clear();
scanf("%d",&m);
for(int i=0;i<m;i++){
scanf("%d%d%d",&u,&v,&w);
addedge(u,v,w);
addedge(v,u,w);
}
Dijkdtra(2);
memset(p,0,sizeof(p));
dfs(1);
printf("%d\n",p[1]);
}
return 0;
}