记录编号 320282 评测结果 AAAAAAAAAA
题目名称 Elaxia的路线 最终得分 100
用户昵称 GravatarAntiLeaf 是否通过 通过
代码语言 C++ 运行时间 0.638 s
提交时间 2016-10-11 20:31:24 内存使用 46.13 MiB
显示代码纯文本
  1. #include<cstdio>
  2. #include<cstring>
  3. #include<algorithm>
  4. #include<queue>
  5. #define INF ((~((1)<<(31)))>>(1))
  6. using namespace std;
  7. const int maxn=1510;
  8. struct edge{int from,to,dis,prev;}e[3000010];
  9. struct node{
  10. int x,dis;
  11. node(int x,int dis):x(x),dis(dis){}
  12. bool operator<(const node &a)const{return dis>a.dis;}
  13. };
  14. void addedge(int,int,int,int*);
  15. void Dijkstra(int,int*);
  16. void SPFA();
  17. int dis[maxn],disu[maxn],disv[maxn],disz[maxn],disw[maxn];
  18. int n,m,u,v,z,w,x,y,l,last[maxn]={0},DAGlast[maxn]={0},len=0,ans=0;
  19. bool vis[maxn],inq[maxn];
  20. int main(){
  21. #define MINE
  22. #ifdef MINE
  23. freopen("travel!.in","r",stdin);
  24. freopen("travel!.out","w",stdout);
  25. #endif
  26. scanf("%d%d%d%d%d%d",&n,&m,&u,&v,&z,&w);
  27. for(int i=1;i<=m;i++){
  28. scanf("%d%d%d",&x,&y,&l);
  29. addedge(x,y,l,last);
  30. addedge(y,x,l,last);
  31. }
  32. Dijkstra(u,disu);
  33. Dijkstra(v,disv);
  34. Dijkstra(z,disz);
  35. Dijkstra(w,disw);
  36. //for(int i=1;i<=n;i++)printf("i=%d disu=%d disv=%d disz=%d disw=%d\n",i,disu[i],disv[i],disz[i],disw[i]);
  37. memset(DAGlast,0,sizeof(DAGlast));
  38. for(int i=1;i<=(m<<1);i++){
  39. //printf("checking (%d,%d) dis1=%d dis2=%d dis=%d\n",e[i].from,e[i].to,disu[e[i].from],disv[e[i].to],e[i].dis);
  40. //printf("another (%d,%d) dis1=%d dis2=%d dis=%d\n",e[i].from,e[i].to,disz[e[i].from],disw[e[i].to],e[i].dis);
  41. if(disu[e[i].from]+e[i].dis+disv[e[i].to]==disu[v]&&disz[e[i].from]+e[i].dis+disw[e[i].to]==disz[w])addedge(e[i].from,e[i].to,e[i].dis,DAGlast);
  42. }
  43. SPFA();
  44. //ans=max(ans,dis[w]);
  45. for(int i=1;i<=n;i++)ans=max(ans,dis[i]);
  46. memset(DAGlast,0,sizeof(DAGlast));
  47. for(int i=1;i<=(m<<1);i++){
  48. //printf("checking (%d,%d) dis1=%d dis2=%d dis=%d\n",e[i].from,e[i].to,disu[e[i].from],disv[e[i].to],e[i].dis);
  49. //printf("another (%d,%d) dis1=%d dis2=%d dis=%d\n",e[i].from,e[i].to,disw[e[i].from],disz[e[i].to],e[i].dis);
  50. if(disu[e[i].from]+e[i].dis+disv[e[i].to]==disu[v]&&disw[e[i].from]+e[i].dis+disz[e[i].to]==disw[z])addedge(e[i].from,e[i].to,e[i].dis,DAGlast);
  51. }
  52. SPFA();
  53. for(int i=1;i<=n;i++)ans=max(ans,dis[i]);
  54. printf("%d",ans);
  55. #ifndef MINE
  56. printf("\n--------------------DONE--------------------\n");
  57. for(;;);
  58. #endif
  59. return 0;
  60. }
  61. void addedge(int x,int y,int z,int *last){
  62. ///*if(last==DAGlast)*/printf("addedge(%d,%d,%d)\n",x,y,z);
  63. e[++len].from=x;
  64. e[len].to=y;
  65. e[len].dis=z;
  66. e[len].prev=last[x];
  67. last[x]=len;
  68. }
  69. void Dijkstra(int x,int *dis){
  70. memset(dis,63,sizeof(int)*maxn);
  71. dis[x]=0;
  72. memset(vis,0,sizeof(vis));
  73. priority_queue<node>q;
  74. q.push(node(x,0));
  75. while(!q.empty()){
  76. x=q.top().x;
  77. q.pop();
  78. if(vis[x])continue;
  79. vis[x]=true;
  80. //printf("dis[%d]=%d\n",x,dis[x]);
  81. for(int i=last[x];i;i=e[i].prev)if(!vis[e[i].to]&&dis[e[i].to]>dis[x]+e[i].dis){
  82. dis[e[i].to]=dis[x]+e[i].dis;
  83. q.push(node(e[i].to,dis[e[i].to]));
  84. }
  85. }
  86. }
  87. void SPFA(){
  88. int x;
  89. queue<int>q;
  90. memset(dis,0,sizeof(dis));
  91. for(int i=1;i<=n;i++){
  92. q.push(i);
  93. inq[i]=true;
  94. }
  95. while(!q.empty()){
  96. x=q.front();
  97. q.pop();
  98. inq[x]=false;
  99. //printf("%d ",x);
  100. for(int i=DAGlast[x];i;i=e[i].prev)if(dis[e[i].to]<dis[x]+e[i].dis){
  101. dis[e[i].to]=dis[x]+e[i].dis;
  102. if(!inq[e[i].to]){
  103. inq[e[i].to]=true;
  104. q.push(e[i].to);
  105. }
  106. }
  107. }//printf("\n");
  108. }