题意:给定一个有向图,问从起点到终点,最短路+比最短路距离长1的路的个数。
思路:最短路+次短路。
#include <iostream> #include <cstdio> #include <algorithm> #include <string> #include <cmath> #include <cstring> #include <queue> #include <set> #include <vector> #include <stack> #include <map> #include <iomanip> #define PI acos(-1.0) #define Max 10005 #define inf 1<<28 #define LL(x) (x<<1) #define RR(x)(x<<1|1) using namespace std; struct kdq { int v,len,next; }edge[Max*100]; int head[Max]; int n,m,num; int start,end; void insert(int u,int v,int len) { edge[num].v=v; edge[num].len=len; edge[num].next=head[u]; head[u]=num; num++; } void init() { memset(head,-1,sizeof(head)); num=0; } int dis[Max][2],visit[Max][2],cnt[Max][2]; void dijkstra() { int i,j; memset(visit,0,sizeof(visit)); memset(cnt,0,sizeof(cnt));//cnt[][]记录最短路和次短路的个数 for(i=1;i<=n;i++) dis[i][0]=dis[i][1]=inf;//dis[i][0]为最短路,dis[i][1]为次短路 dis[start][0]=0; cnt[start][0]=1; for(i=1 ; i<=2*n ;++i) { int MIN=inf; int index=-1,road=-1; for(j=1; j<=n ;++j)//找新的最短路和次短路 { if(!visit[j][0]&&dis[j][0]<MIN) { index=j; road=0; MIN=dis[j][0]; } else if(!visit[j][1]&&dis[j][1]<MIN) { index=j; road=1; MIN=dis[j][1]; } } if(index==-1)//如果未找到,跳出 break; visit[index][road]=1;//标记 for(j = head[index] ; j !=-1 ;j=edge[j].next) { int tt=edge[j].v; int ttt=edge[j].len; if(dis[tt][0]>MIN+ttt)//如果找到的新的值比最短路小,则更新最短路和次短路的值 { dis[tt][1]=dis[tt][0];//更新次短路 dis[tt][0]=MIN+ttt;// 更新最短路 cnt[tt][1]=cnt[tt][0];//更新最短路和次短路的个数 cnt[tt][0]=cnt[index][road]; } else if(dis[tt][0]==MIN+ttt)//如果值等于最短路 { cnt[tt][0]+=cnt[index][road];//更新最短路的个数 } else if(dis[tt][1]>MIN+ttt)//如果找到的值小于次短路的值,更新次短路 { dis[tt][1]=MIN+ttt; //更新次短路的值 cnt[tt][1]=cnt[index][road];//更新次短路的个数 } else if(dis[tt][1]==MIN+ttt)//如果找到的值等于次短路的值 { cnt[tt][1]+=cnt[index][road];//更新次短路的个数 } } } if(dis[end][1]==dis[end][0]+1)//如果次短路的值等于最短路值+1 cnt[end][0]+=cnt[end][1]; printf("%d\n",cnt[end][0]); } int main() { int i,j,k,l,T; int a,b,s; scanf("%d",&T); while(T--) { scanf("%d%d",&n,&m); init(); while(m--) { scanf("%d%d%d",&a,&b,&s); insert(a,b,s); } scanf("%d%d",&start,&end); dijkstra(); } return 0; }