hdu1142(dijastra+记忆化搜索)

来源:互联网 发布:思科网络认证 编辑:程序博客网 时间:2024/05/23 11:24

题目链接A Walk Through the Forest


记忆化搜索介绍 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;}

0 0
原创粉丝点击