zoukankan      html  css  js  c++  java
  • hdu 4179(有限制的最短路)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4179

    思路:不知道怎么回事,wa了n多次,然后不知道怎么回事就过了==,还是简单的说一下思路吧:一次以起点为源点跑一遍spfa,然后以终点为起点跑一次spfa,这样我们就可以枚举difficult为maxdist的边了,设该边的端点为x,y,于是有ans=min(ans,dist1[x]+Get_Dist(x,y)+dist2[y])。

      1 #include<iostream>
      2 #include<cstdio>
      3 #include<cstring>
      4 #include<algorithm>
      5 #include<queue>
      6 #include<vector>
      7 #include<cmath>
      8 using namespace std;
      9 typedef pair<int,double>Pair;
     10 #define MAXN 44444
     11 #define inf 1e16
     12 double dist1[MAXN],dist2[MAXN];
     13 bool mark[MAXN];
     14 struct Edge{
     15     int v;
     16     double w;
     17     Edge(){}
     18     Edge(int _v,double _w){
     19         v=_v,w=_w;
     20     }
     21 };
     22 vector<Edge>map1[MAXN],map2[MAXN];
     23 vector<int>vet;
     24 struct Point{
     25     int x,y,z;
     26 }point[MAXN];
     27 
     28 struct Node{
     29     int vs,vt;
     30 }node[MAXN];
     31 int n,m,st,ed,maxdist;
     32 
     33 double Get_Dist(int vs,int vt){
     34     double xx=1.0*(point[vs].x-point[vt].x)*(point[vs].x-point[vt].x);
     35     double yy=1.0*(point[vs].y-point[vt].y)*(point[vs].y-point[vt].y);
     36     double zz=1.0*(point[vs].z-point[vt].z)*(point[vs].z-point[vt].z);
     37     return sqrt(xx+yy+zz);
     38 }
     39 
     40 int Get(int vs,int vt){
     41     if(point[vs].z<point[vt].z){
     42         double xx=1.0*(point[vs].x-point[vt].x)*(point[vs].x-point[vt].x);
     43         double yy=1.0*(point[vs].y-point[vt].y)*(point[vs].y-point[vt].y);
     44         double dd=sqrt(xx+yy);
     45         return (int)(100*(point[vt].z-point[vs].z)/dd);
     46     }
     47     return 0;
     48 }
     49 
     50 void SPFA(int st,vector<Edge>map[],double dist[])
     51 {
     52     memset(mark,false,(n+2)*sizeof(mark[0]));
     53     for(int i=1;i<=n;i++)dist[i]=inf;
     54     dist[st]=0;mark[st]=true;
     55     queue<int>Q;
     56     Q.push(st);
     57     while(!Q.empty()){
     58         int u=Q.front();
     59         Q.pop();
     60         mark[u]=false;
     61         for(int i=0;i<map[u].size();i++){
     62             int v=map[u][i].v;
     63             double w=map[u][i].w;
     64             if(dist[u]+w<dist[v]){
     65                 dist[v]=dist[u]+w;
     66                 if(!mark[v]){ mark[v]=true;Q.push(v); }
     67             }
     68         }
     69     }
     70 }
     71 
     72 
     73 int main()
     74 {
     75    // freopen("1.txt","r",stdin);
     76     while(scanf("%d%d",&n,&m),(n+m)){
     77         for(int i=1;i<=n;i++){ map1[i].clear();map2[i].clear();};
     78         vet.clear();
     79         for(int i=1;i<=n;i++){
     80             scanf("%d%d%d",&point[i].x,&point[i].y,&point[i].z);
     81         }
     82         for(int i=1;i<=m;i++){
     83             scanf("%d%d",&node[i].vs,&node[i].vt);
     84         }
     85         scanf("%d%d%d",&st,&ed,&maxdist);
     86         for(int i=1;i<=m;i++){
     87             double dd=Get_Dist(node[i].vs,node[i].vt);
     88             int d1=Get(node[i].vs,node[i].vt);
     89             int d2=Get(node[i].vt,node[i].vs);
     90             if(d1<=maxdist){
     91                 map1[node[i].vs].push_back(Edge(node[i].vt,dd));
     92                 map2[node[i].vt].push_back(Edge(node[i].vs,dd));
     93             }
     94             if(d2<=maxdist){
     95                 map1[node[i].vt].push_back(Edge(node[i].vs,dd));
     96                 map2[node[i].vs].push_back(Edge(node[i].vt,dd));
     97             }
     98             if(d1==maxdist){
     99                 vet.push_back(node[i].vs);
    100                 vet.push_back(node[i].vt);
    101             }
    102             if(d2==maxdist){
    103                 vet.push_back(node[i].vt);
    104                 vet.push_back(node[i].vs);
    105             }
    106         }
    107         SPFA(st,map1,dist1);
    108         SPFA(ed,map2,dist2);
    109         double ans=inf;
    110         for(int i=0;i<vet.size();i+=2){
    111             int x=vet[i],y=vet[i+1];
    112             double dd=dist1[x]+Get_Dist(x,y)+dist2[y];
    113             if(dd<ans)ans=dd;
    114         }
    115         if(ans<inf){
    116             printf("%.1lf\n",ans);
    117         }else
    118             puts("None");
    119     }
    120     return 0;
    121 }
    View Code
  • 相关阅读:
    Java Spring Boot VS .NetCore (十) Java Interceptor vs .NetCore Interceptor
    Java Spring Boot VS .NetCore (九) Spring Security vs .NetCore Security
    IdentityServer4 And AspNetCore.Identity Get AccessToken 问题
    Java Spring Boot VS .NetCore (八) Java 注解 vs .NetCore Attribute
    Java Spring Boot VS .NetCore (七) 配置文件
    Java Spring Boot VS .NetCore (六) UI thymeleaf vs cshtml
    Java Spring Boot VS .NetCore (五)MyBatis vs EFCore
    Java Spring Boot VS .NetCore (四)数据库操作 Spring Data JPA vs EFCore
    Java Spring Boot VS .NetCore (三)Ioc容器处理
    Java Spring Boot VS .NetCore (二)实现一个过滤器Filter
  • 原文地址:https://www.cnblogs.com/wally/p/3134123.html
Copyright © 2011-2022 走看看