poj3463 hdu1688 次短路+优先队列 如果让我说:我只能说,实力决定一切

来源:互联网 发布:淘宝国庆节活动 编辑:程序博客网 时间:2024/04/30 09:09

思路:该题的思路和hdu3191一样,只是题目要求输出最短路和次短路的条数 最短路和次短路要求相差1

#include<iostream>#include<algorithm>#include<cstdio>#include<string.h>#include<vector>#include<queue>using namespace std;const int inf=1<<30;const int maxn=1010;struct Edge{    int to,w;};struct node{    int v,dist;    int mark;    bool friend operator <(const node &a,const node &b)    {        if(a.dist!=b.dist)            return a.dist>b.dist;        return a.v>b.v;    }};priority_queue<node> Q;vector<Edge>gra[maxn*10];int dp[maxn][3];int vis[maxn][3];int dis[maxn][3];int T,N,M,A,B,L;void init(){    for(int i=0; i<maxn; i++)    {        dp[i][1]=dp[i][2]=0;        vis[i][1]=vis[i][2]=0;        dis[i][1]=dis[i][2]=inf;    }}void Dijstra(int st,int ed){    dis[st][1]=0;    dp[st][1]=1;    node q,p;    p.dist=0;    p.mark=1;    p.v=st;    Q.push(p);    while(!Q.empty())    {        q=Q.top();        Q.pop();        if(vis[q.v][q.mark])            continue;        vis[q.v][q.mark]=1;        for(int i=0; i<gra[q.v].size(); i++)        {            int vv=gra[q.v][i].to;            int ww=gra[q.v][i].w;            if(!vis[vv][1]&&dis[vv][1]>q.dist+ww)            {                if(dis[vv][1]!=inf)                {                    dis[vv][2]=dis[vv][1];                    dp[vv][2]=dp[vv][1];                    p.dist=dis[vv][2];                    p.mark=2;                    p.v=vv;                    Q.push(p);                }                dis[vv][1]=q.dist+ww;                dp[vv][1]=dp[q.v][q.mark];                p.mark=1;                p.dist=dis[vv][1];                p.v=vv;                Q.push(p);            }            else if(!vis[vv][1]&&dis[vv][1]==q.dist+ww)            {                dp[vv][1]+=dp[q.v][q.mark];            }            else if(!vis[vv][2]&&dis[vv][2]>q.dist+ww)            {                dis[vv][2]=q.dist+ww;                dp[vv][2]=dp[q.v][q.mark];                p.mark=2;                p.dist=dis[vv][2];                p.v=vv;                Q.push(p);            }            else if(!vis[vv][2]&&dis[vv][2]==q.dist+ww)            {                dp[vv][2]+=dp[q.v][q.mark];            }        }    }}int main(){    scanf("%d",&T);    Edge tem;    int st,ed;    while(T--)    {        init();        for(int i=0;i<maxn*10;i++)          gra[i].clear();        scanf("%d%d",&N,&M);        for(int i=0; i<M; i++)        {            scanf("%d%d%d",&A,&B,&L);            tem.to=B;            tem.w=L;            gra[A].push_back(tem);        }        scanf("%d%d",&st,&ed);        Dijstra(st,ed);        if(dis[ed][1]+1==dis[ed][2])            printf("%d\n",dp[ed][1]+dp[ed][2]);        else            printf("%d\n",dp[ed][1]);    }    return 0;}