首页 > 其他 > 详细

Elaxia 的路线——抛弃Dijkstra 吧

时间:2017-09-04 23:17:19      阅读:294      评论:0      收藏:0      [点我收藏+]

  方法是看的题解。大神告诉了我怎样快速判断特定点是否在其它两点之间的最短路上,感激不尽。我自己刚开始打的(屎)Dijkstra 又和从前一样是答案错误,这次少一些,两个。果断抛弃了Dijkstra,用上了辣鸡SPFA,过了。

技术分享
 1 #include<algorithm>
 2 #include<iostream>
 3 #include<cstring>
 4 #include<vector>
 5 #include<cstdio>
 6 #include<queue>
 7 using namespace std;
 8 const int N=2048,INF=0x3f3f3f3f;
 9 int res,n,m,sx,sy,tx,ty;
10 int d1[N],d2[N],d3[N],d4[N];
11 vector<int> gr[N],dis[N];
12 bool check(int x){return d1[x]+d2[x]==d1[sy]&&d3[x]+d4[x]==d3[ty];}
13 int spfa(int sp,int d[N]){
14     bool vis[N];
15     queue<int> q;
16     memset(vis,0,sizeof vis);
17     
18     d[sp]=0;vis[sp]=true;
19     q.push(sp);
20     while(!q.empty()){
21         int x=q.front();q.pop();
22         vis[x]=false;
23         for(int i=0;i<gr[x].size();i++)
24             if(d[gr[x][i]]>d[x]+dis[x][i]){
25                 d[gr[x][i]]=d[x]+dis[x][i];
26                 if(!vis[gr[x][i]])q.push(gr[x][i]),vis[gr[x][i]]=true;
27             }
28     }
29 }
30 int main(){
31     memset(d1,0x3f,sizeof d1);memset(d2,0x3f,sizeof d2);
32     memset(d3,0x3f,sizeof d3);memset(d4,0x3f,sizeof d4);
33     
34     cin>>n>>m>>sx>>sy>>tx>>ty;
35     for(int i=1;i<=m;i++){
36         int x,y,v;scanf("%d%d%d",&x,&y,&v);
37         gr[x].push_back(y);dis[x].push_back(v);
38         gr[y].push_back(x);dis[y].push_back(v);
39     }
40     
41     spfa(sx,d1);spfa(sy,d2);
42     spfa(tx,d3);spfa(ty,d4);
43     
44     for(int i=1;i<=n;i++)
45         if(check(i))
46             for(int j=i+1;j<=n;j++)
47                 if(check(j))
48                     res=max(res,abs(d1[i]-d1[j]));
49     cout<<res<<endl;
50     return 0;
51 }
Method_01

  洛谷 Yukikaze 500ms

Elaxia 的路线——抛弃Dijkstra 吧

原文:http://www.cnblogs.com/duskfire/p/7476264.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!