传说中的次短路

我不知道我是不是对了,没数据真是忧伤,我是传统的A*+SPFA算法,

原题是求次短路,我借此学了一下这种神奇的东西。

  1 #include <iostream>
  2 #include <fstream>
  3 #include <cstdlib>
  4 #include <cstring>
  5 /* run this program using the console pauser or add your own getch, system("pause") or input loop */
  6 using namespace std;
  7 ifstream fin("secondpath.in");
  8 ofstream fout("secondpath.out");
  9
 10 int places=0,rodes=0;
 11 int qi=0,zhong=0;
 12 int head[1005],cnt=0;
 13 struct id{
 14  int nxt;
 15  int to;
 16  int quan;
 17 };
 18 id lian[200005];
 19 int dui[1003],jv[1003];
 20 int jv2[1003];
 21 bool used[1003];
 22 int you_dui[200005][2],gs_cnt=0;
 23 //int zhan[200003];
 24
 25
 26 void add(int co,int dao,int bian);
 27 void spfa( );
 28 void a_xin( );
 29 int na(int sze);
 30 void fang(int sze,int zhi);
 31
 32
 33 void add(int co,int dao,int bian){
 34 lian[++cnt].nxt=head[co];
 35 lian[cnt].to=dao;
 36 lian[cnt].quan=bian;
 37 head[co]=cnt;
 38 return;
 39 }
 40
 41
 42 void spfa( ){
 43 memset(jv,127/2,sizeof(jv));
 44 int tou=0,wei=1;
 45 dui[1]=zhong;jv[zhong]=0;
 46 used[zhong]=1;
 47 while(tou!=wei){
 48  tou++;if(tou>1001)tou=1;
 49  int cong=dui[tou];
 50  for(int x=head[cong];x!=-1;x=lian[x].nxt){
 51   int dao=lian[x].to;
 52   if(jv[dao]>jv[cong]+lian[x].quan){
 53    jv[dao]=jv[cong]+lian[x].quan;
 54    if(used[dao]==0){
 55     wei++;if(wei>1001)wei=1;
 56     dui[wei]=dao;used[dao]=1;
 57    }
 58   }
 59  }
 60  used[cong]=0;
 61 }
 62 return;
 63 }
 64
 65
 66 void a_xin( ){
 67 memset(you_dui,127/2,sizeof(you_dui));
 68 memset(jv2,127/2,sizeof(jv2));
 69 jv2[qi]=0;you_dui[1][0]=0;
 70 you_dui[1][1]=qi;gs_cnt=1;
 71 int pd=0,shang=-1;
 72 while(pd<2&&gs_cnt!=0){
 73  int sze=you_dui[1][1];
 74  int jvli=na(1);
 75  //for(int x=1;x<=gs_cnt;x++)cout<<you_dui[x][0]<<" ";
 76 //  cout<<endl;
 77 //  system ("pause");
 78  if(sze==zhong&&shang!=jvli){pd++;shang=jvli;continue;}
 79  for(int hao=head[sze];hao!=-1;hao=lian[hao].nxt){
 80   int dao=lian[hao].to;
 81   if(jv2[sze]+lian[hao].quan!=jv2[dao])fang(dao,jv2[sze]+lian[hao].quan+jv[dao]);
 82   if(jv2[sze]+lian[hao].quan<jv2[dao]){jv2[dao]=jv2[sze]+lian[hao].quan;}
 83  }
 84 // for(int x=1;x<=gs_cnt;x++)cout<<you_dui[x][0]<<" ";
 85 // cout<<endl;
 86 //  system ("pause");
 87 }
 88 if(pd<2){cout<<"-1";fout<<"-1";return;}
 89 cout<<shang;fout<<shang;
 90 return;
 91 }
 92
 93
 94 int na(int sze){
 95 int a=you_dui[sze][1];
 96 you_dui[sze][1]=you_dui[gs_cnt][1];
 97 you_dui[gs_cnt][1]=a;
 98 a=you_dui[sze][0];you_dui[sze][0]=you_dui[gs_cnt][0];
 99 you_dui[gs_cnt][0]=a;gs_cnt--;
100 int now=1,zi=0;
101 while(now*2<=gs_cnt){
102  zi=now*2;
103  if(now*2<gs_cnt&&you_dui[zi+1][0]<you_dui[zi][0])zi++;
104  if(you_dui[zi][0]>you_dui[now][0])return a;
105  int b=you_dui[zi][0];you_dui[zi][0]=you_dui[now][0];
106  you_dui[now][0]=b;b=you_dui[zi][1];
107  you_dui[zi][1]=you_dui[now][1];you_dui[now][1]=b;
108  now=zi;
109 }
110 return a;
111 }
112
113
114 void fang(int sze,int zhi){
115 you_dui[++gs_cnt][1]=sze;
116 you_dui[gs_cnt][0]=zhi;
117 int now=gs_cnt,fu=0;
118 while(now/2>0){
119  fu=now/2;
120  if(you_dui[fu][0]<you_dui[now][0])return;
121  int a=you_dui[now][0];you_dui[now][0]=you_dui[fu][0];
122  you_dui[fu][0]=a;a=you_dui[now][1];you_dui[now][1]=you_dui[fu][1];
123  you_dui[fu][1]=a;now=fu;
124 }
125 return;
126 }
127
128
129 int main(int argc, char** argv) {
130 fin>>places>>rodes;
131 memset(head,-1,sizeof(head));
132 for(int x=1;x<=rodes;x++){
133 int a,b,c;
134 fin>>a>>b>>c;
135 add(a,b,c);
136 add(b,a,c);
137 }
138 fin>>qi>>zhong;
139 spfa( );
140 a_xin( );
141
142  return 0;
143 }
时间: 2024-08-28 07:20:21

传说中的次短路的相关文章

hdu3461Marriage Match IV 最短路+最大流

//给一个图.给定起点和终点,仅仅能走图上的最短路 //问最多有多少种走的方法.每条路仅仅能走一次 //仅仅要将在最短路上的全部边的权值改为1.求一个最大流即可 #include<cstdio> #include<cstring> #include<iostream> #include<queue> #include<vector> using namespace std ; const int inf = 0x3f3f3f3f ; const

UESTC30-最短路-Floyd最短路、spfa+链式前向星建图

最短路 Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) 在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的T-shirt.但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最短的从商店到赛场的路线,你可以帮助他们吗? Input 输入包括多组数据. 每组数据第一行是两个整数NN ,MM (N≤100N≤100 ,M≤10000M≤1000

ACM: HDU 2544 最短路-Dijkstra算法

HDU 2544最短路 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Description 在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt.但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最短的从商店到赛场的路线,你可以帮助他们吗? Input 输入包括多组数据.每组数据第一行是两个整数N.M(N<=100,M<

ACM/ICPC 之 昂贵的聘礼-最短路解法(POJ1062)

//转移为最短路问题,枚举必经每一个不小于酋长等级的人的最短路 //Time:16Ms Memory:208K #include<iostream> #include<cstring> #include<cstdio> #include<cmath> #include<algorithm> using namespace std; #define INF 0x3f3f3f3f #define MAX 105 int lim, n; int p[M

图论(A*算法,K短路) :POJ 2449 Remmarguts&#39; Date

Remmarguts' Date Time Limit: 4000MS   Memory Limit: 65536K Total Submissions: 25216   Accepted: 6882 Description "Good man never makes girls wait or breaks an appointment!" said the mandarin duck father. Softly touching his little ducks' head, h

hdu4725 拆点+最短路

题意:有 n 个点,每个点有它所在的层数,最多有 n 层,相邻两层之间的点可以互相到达,消耗 c (但同一层并不能直接到达),然后还有一些额外的路径,可以在两点间互相到达,并且消耗一定费用.问 1 点到 n 点的最小花费 将每一层拆成两个点,分别为进入层和出发层,然后相邻层的出发层可以指向进入层,花费 c,每个点可以到达其出发层,而进入层可以到达该点,花费 0 ,最后建立其余双向边,最短路 1 #include<stdio.h> 2 #include<string.h> 3 #in

hdu3416 最短路+最大流

题意:有 n 点 m 边,有出发点 A 到达点 B ,只允许走原图中的最短路,但每条边只允许被走一次,问最多能找出多少条边不重复的最短路 一开始做到的时候瞎做了一发最短路,WA了之后也知道显然不对,就放着了,后来打了今年的多校,再做到的时候发现和多校第一场的1007一样的……最短路+网络流就行了,只不过第一次做这个的时候我还不知道网络流是啥,不会做也正常啦. 首先对于原图跑一遍最短路求出每个点距离 A 点的最短路,然后对于每一条边,如果它的权值等于它连接的两点的最短路的差值的时候,就说明这条路是

【啊哈!算法】算法7:Dijkstra最短路算法

上周我们介绍了神奇的只有五行的Floyd最短路算法,它可以方便的求得任意两点的最短路径,这称为“多源最短路”.本周来来介绍指定一个点(源点)到其余各个顶点的最短路径,也叫做“单源最短路径”.例如求下图中的1号顶点到2.3.4.5.6号顶点的最短路径. <ignore_js_op> 与Floyd-Warshall算法一样这里仍然使用二维数组e来存储顶点之间边的关系,初始值如下. <ignore_js_op> 我们还需要用一个一维数组dis来存储1号顶点到其余各个顶点的初始路程,如下.

HDU ACM 2544 最短路-&gt;最短路

最短路,简单题,floyd实现,在求最短路时一定要是是最大节点编号maxnum而不是输入的n,否则是错的. #include<iostream> using namespace std; int map[105][105]; //无向图 void Init() { int MAX=1000000,i,j; for(i=1;i<=104;i++) for(j=1;j<=104;j++) if(i==j) map[i][j]=0; else map[i][j]=MAX; } void