poj 3463 次短路

题意:给定一个有向图,问从起点到终点,最短路+比最短路距离长1的路的个数。

当年数据结构课程设计用A*做过,现在忘光了,2333

 1 #include<stdio.h>
 2 #include<string.h>
 3 #include<stdlib.h>
 4 #include<queue>
 5 #define VM 1005
 6 #define EM 10010
 7 using namespace std;
 8 const int inf=0x3f3f3f3f;
 9 int head[VM],cnt[VM][2],dist[VM][2],vis[VM][2];//dis[i][0]为最短路,dis[i][1]为次短路
10 int e,src,des,n,m;
11 struct E
12 {
13     int to,w,next;
14 } edge[EM];
15 void add(int cu,int cv,int cw)
16 {
17     edge[e].to=cv;
18     edge[e].w=cw;
19     edge[e].next=head[cu];
20     head[cu]=e ++;
21 }
22 int dij()
23 {
24     int i,j,u,min,flag;
25     memset(dist,0x3f,sizeof(dist));
26     memset(vis,0,sizeof(vis));
27     memset(cnt,0,sizeof(cnt));
28     dist[src][0]=0;
29     cnt[src][0]=1;
30     for(i=1;i<2*n;i++)
31     {
32         min=inf;
33         for(j=1;j<=n;j++)           //找新的最短路和次短路
34             if(!vis[j][0]&&dist[j][0]<min)
35             {
36                 u=j;
37                 flag=0;
38                 min=dist[j][0];
39             }
40             else if(!vis[j][1]&&dist[j][1]<min)
41             {
42                 u=j;
43                 flag=1;
44                 min=dist[j][1];
45             }
46         if(min==inf)
47             break;
48         vis[u][flag]=1;
49         for(j=head[u];j!=-1;j=edge[j].next)
50         {
51             int v=edge[j].to;
52             int w=edge[j].w+min;
53             if(dist[v][0]>w) //如果找到的新的值比最短路小,则更新最短路和次短路的值
54             {
55                 dist[v][1]=dist[v][0];//更新次短路
56                 dist[v][0]=w;// 更新最短路
57                 cnt[v][1]=cnt[v][0];
58                 cnt[v][0]=cnt[u][flag];//更新最短路和次短路的个数
59
60             }
61             else if(dist[v][0]==w)   //如果值等于最短路
62                 cnt[v][0]+=cnt[u][flag];//更新最短路的个数
63             else if(dist[v][1]>w)    //如果找到的值小于次短路的值,更新次短路
64             {
65                 dist[v][1]=w;    //更新次短路的值
66                 cnt[v][1]=cnt[u][flag];  //更新次短路的个数
67             }
68             else if(dist[v][1]==w)   //如果找到的值等于次短路的值
69                 cnt[v][1]+=cnt[u][flag];//更新次短路的个数
70         }
71
72     }
73     if(dist[des][0]+1==dist[des][1])//如果次短路的值等于最短路值+1
74         cnt[des][0]+=cnt[des][1];
75     return cnt[des][0];
76 }
77 int main()
78 {
79     int T,u,v,w;
80     scanf("%d",&T);
81     while(T--)
82     {
83         scanf("%d%d",&n,&m);
84         memset(head,0xff,sizeof(head));
85         e=0;
86         while(m--)
87         {
88             scanf("%d%d%d",&u,&v,&w);
89             add(u,v,w);
90         }
91         scanf("%d%d",&src,&des);
92         int ans=dij();
93         printf("%d\n",ans);
94     }
95     return 0;
96 }
时间: 2024-10-07 05:02:19

poj 3463 次短路的相关文章

poj 3463 最短路+次短路

独立写查错不能,就是维护一个次短路的dist 题意:给定一个有向图,问从起点到终点,最短路+比最短路距离长1的路的个数. Sample Input25 81 2 31 3 21 4 52 3 12 5 33 4 23 5 44 5 31 55 62 3 13 2 13 1 104 5 25 2 75 2 74 1 Sample Output32 2015-05-14 1 #include<cstdio> 2 #include<iostream> 3 #include<algo

poj 3463 最短路与次短路&amp;&amp;统计个数

题意:求最短路和比最短路长度多1的次短路的个数 本来想图(有)方(模)便(版)用spfa的,结果妹纸要我看看dijkstra怎么解.... 写了三遍orz Ver1.0:堆优化+邻接表,WA 1 //不能用堆优化+邻接表,因为需要处理dis[i][0]和dis[i][1]两套,如果都挤到一个堆里就乱套了 2 3 #include <iostream> 4 #include <cstdio> 5 #include <queue> 6 #include <cstrin

poj 3463 最短路与次短路的方案数求解

Sightseeing Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 8968   Accepted: 3139 Description Tour operator Your Personal Holiday organises guided bus trips across the Benelux. Every day the bus moves from one city S to another city F. O

poj 3463 Sightseeing(最短路+次短路)

http://poj.org/problem?id=3463 大致题意:给出一个有向图,从起点到终点求出最短路和次短路的条数之和. 解法: 用到的数组:dis[i][0]:i到起点的最短路,dis[i][1]:i到起点的严格次短路 vis[i][0],vis[i][1]:同一维的vis数组,标记距离是否已确定 sum[i][0]:i到起点的最短路条数,sum[i][1]:i到起点的次短路条数 同一维dijkstra,内循环先找出最短的距离(次短路或最短路)d,然后枚举与该点相连的点: if(d

poj 3463 Sightseeing (dij 求最短路和次短路并计数)

dijkstra求最短路和次短路的求法和计算  模板 dijkstra求最短路的变形. 外循环要循环2*n-1次,因为dis[n][2]有2*n个状态,而dis[s][0]已经用过一次. 算法: 1.如果比最短路短就更新最短路和次短路. 2.如果和最短路相等,更新最短路的计数. 3.如果和次短路相等,更新次短路的方法数. 4.如果比次短路短,更新次短路. #include<cstdio> #include<iostream> #include<cstring> #inc

poj 3463 Sightseeing 最短路径数量

题意: 求有向图中最短路和比最短路大1的路径数量. 思路: 需要理解dijkstra算法中dis[n]数组的含义,设cnt[i]表示到点i的最短路径数量,cnt1[i]表示到点i比最短路大1的路径数量.在运行dijkstra算法的过程中每次获得最小dis[i]的时候可以对所有dis[v]+w(v,i)==dis[i]的v做如下更新cnt[i]+=cnt[v],cnt1[i]+=cnt1[v].而当所有值为某数的dis[i]计算完成时也就是对任意i,dis[i]为同一值且不再变化时,可以对这些满足

poj 1502 最短路+坑爹题意

链接:http://poj.org/problem?id=1502 MPI Maelstrom Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 5249   Accepted: 3237 Description BIT has recently taken delivery of their new supercomputer, a 32 processor Apollo Odyssey distributed share

POJ 2448(K短路,A*+SPFA) Remmarguts&#39; Date

题意 给一个n个点m条边的图,然后给一个起点和一个终点,求起点到终点的第K短路. 思路 求第K短路.一个经典的问题. SPFA+A* 核心思想在A*搜索的估计函数的建立上. F(x) = g(x) + h(x) 估价函数 = s到x的距离 + x到t的距离 估价函数的含义就是经过x这个点的路径的距离. 我们在搜索的时候每次选择估价函数较小的值,进行拓展.这样我们搜索到t点的状态出来顺序就是,最短路-次短路-.第三短路- 就减少了我们搜索的状态数. 代码实现上,实现一个估价函数的结构体,然后是实现

poj 1135 最短路 dijkstra

传送门 http://poj.org/problem?id=1135 建模分两部分:1.如果最后是关键牌倒下,那么找最短路中最长的就行--最远的倒下,其他的牌一定倒下,所以找最远的最短路 2.如果最后是普通牌倒下,那么找三角形,三角形周长的一半就是倒下的位置 到底是情况1还是情况2,自己在脑子模拟一下就能想到,还是那句话,最难倒下的倒下了,其他的一定都倒下了,若第二种情况的时间比第一种长,那么就是第二种,反之,第一种 上代码 /**********************************