码迷,mamicode.com
首页 > 其他好文 > 详细

传说中的次短路

时间:2015-12-17 12:48:03      阅读:184      评论:0      收藏:0      [点我收藏+]

标签:

我不知道我是不是对了,没数据真是忧伤,我是传统的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 }

 

传说中的次短路

标签:

原文地址:http://www.cnblogs.com/Ateisti/p/5053446.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!