• 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
  • 相关阅读:
    Excel与Google Sheets中实现线性规划求解
    Optaplanner终于支持多线程并行运行
    【译】Optaplanner开发手册本地化: (0)
    多工序、多机台(产线)环境下的排程要点
    设计Optaplanner下实时规划服务的失败经历
    Optaplanner规划引擎的工作原理及简单示例(2)
    vim 分屏
    vim autocmd
    irun vcs option
    记录
  • 原文地址:https://www.cnblogs.com/wally/p/3134123.html
Copyright © 2020-2023  润新知