HDU 1142(djstar+记忆化搜索)

来源:互联网 发布:淘宝开店协议点同意 编辑:程序博客网 时间:2024/05/18 01:19

题意不是问最短路有多少条,而是问从下一个点出发有多少条路比从当前点出发到2(终点)要短??   最短路算法方面是直接套用的模板,不过这次不是先求终点到各点的最短路,再从源点进行搜索。

#include<stdio.h>#include<string.h>#include<vector>#include<queue>using namespace std;const int N=1100;const int INF=0x3f3f3f3f;struct node{    int u,d;    int operator<(const node x)const    {        return x.d<d;    }};struct maps{    int v,w;}edge[N*N];vector<int> g[N];int n,s,cnt,d[N],dp[N];void init(){    for(int i=0;i<N;i++)    {        g[i].clear();        d[i]=INF;    }    cnt=0;    memset(dp,0,sizeof(dp));}void add(int u,int v,int w){    edge[cnt].v=v,edge[cnt].w=w;    g[u].push_back(cnt++);}void dijstar(int s){    priority_queue<node> q;    node cur,next;    cur.u=s,cur.d=0;    d[s]=0;    q.push(cur);    maps e;    int i,u;    while(!q.empty())    {        cur=q.top();        q.pop();        u=cur.u;        if(d[u]!=cur.d) continue;        for(i=0;i<g[u].size();i++)        {            e=edge[g[u][i]];            if(d[e.v]>d[u]+e.w)            {                d[e.v]=d[u]+e.w;                next.u=e.v,next.d=d[e.v];                q.push(next);            }        }    }}int dfs(int u){    if(u==2)    return 1;    if(dp[u])   return dp[u];    int tmp=0;    for(int i=0;i<g[u].size();i++)    {        int v=edge[g[u][i]].v;        if(d[v]<d[u])        {            tmp+=dfs(v);        }    }    dp[u]=tmp;    return dp[u];}int main(){    int m,i,u,v,w;    while(scanf("%d",&n)!=EOF&&n)    {        scanf("%d",&m);        init();        while(m--)        {            scanf("%d%d%d",&u,&v,&w);            add(u,v,w);            add(v,u,w);        }        dijstar(2);        printf("%d\n",dfs(1));    }    return 0;}


0 0
原创粉丝点击