标签:
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1688
题意:求最短路和次短路条数如果次短路长度=最短路长度+1
这输出次短路条数+最短路条数,否则输出最短路条数
分析:这是到模版题,献上模版:
#include<stdio.h> #include<string.h> #include<algorithm> #include<iostream> #include<queue> #include<vector> using namespace std; const int inf=1<<30; const int maxn=1000+10; typedef struct Edge { int v,w; }; typedef struct Node { int dis,mark,v; bool operator < (const Node &n)const { return n.dis<dis; } }; vector<Edge>vec[maxn]; int dis[maxn][3],num[maxn][3],n,m; bool visit[maxn][3]; void init(int len) { for(int i=0;i<=len;i++) vec[i].clear(); } void add(int u,int v,int w) { Edge e; e.v=v,e.w=w; vec[u].push_back(e); } void spfa(int start,int end) { for(int i=0;i<=n;i++) { dis[i][1]=dis[i][2]=inf; num[i][1]=num[i][2]=0; visit[i][1]=visit[i][2]=false; } dis[start][1]=0,num[start][1]=1; priority_queue<Node>Q; Node p,q; p.dis=0,p.mark=1,p.v=start; Q.push(p); while(!Q.empty()) { p=Q.top(); Q.pop(); if(visit[p.v][p.mark]) continue; visit[p.v][p.mark]=true; for(int i=0;i<vec[p.v].size();i++) { int v=vec[p.v][i].v; int w=vec[p.v][i].w; if(!visit[v][1]&&p.dis+w<dis[v][1]) { if(dis[v][1]!=inf) { dis[v][2]=dis[v][1]; num[v][2]=num[v][1]; q.dis=dis[v][2],q.mark=2,q.v=v; Q.push(q); } dis[v][1]=p.dis+w; num[v][1]=num[p.v][p.mark]; q.dis=dis[v][1],q.mark=1,q.v=v; Q.push(q); } else if(!visit[v][1]&&p.dis+w==dis[v][1]) { num[v][1]+=num[p.v][p.mark]; } else if(!visit[v][2]&&p.dis+w<dis[v][2]) { dis[v][2]=p.dis+w; num[v][2]=num[p.v][p.mark]; q.dis=dis[v][2],q.mark=2,q.v=v; Q.push(q); } else if(!visit[v][2]&&p.dis+w==dis[v][2]) { num[v][2]+=num[p.v][p.mark]; } } } return; } int main() { int T,u,v,w,s,t; scanf("%d",&T); while(T--) { scanf("%d%d",&n,&m); init(n); while(m--) { scanf("%d%d%d",&u,&v,&w); add(u,v,w); } scanf("%d%d",&s,&t); spfa(s,t); if(dis[t][1]+1==dis[t][2]) printf("%d\n",num[t][1]+num[t][2]); else printf("%d\n",num[t][1]); } return 0; }
hdu 1688 Sightseeing【最短路,次短路条数】
标签:
原文地址:http://blog.csdn.net/letterwuyu/article/details/45973829