首页 > 其他分享 >P1491 集合位置

P1491 集合位置

时间:2022-10-18 15:34:35浏览次数:42  
标签:P1491 pii int double 位置 nd dijkstra 集合 define

#include<bits/stdc++.h>
using namespace std;
#define edge(i,x) for(int i=h[x],y; i; i=to[i].nt)
#define ll long long
const int N=200001;
struct node{
    double x,y;
    void read(){
        cin>>x>>y;
        return;
    }
};
struct edges{
    int nt,to;
    double w;
};
int h[N];
edges to[N*2];
node nd[N];
int n,m,cnt;
void add(int x,int y,double z)
{
    to[++cnt]=(edges){h[x],y,z};
    h[x]=cnt;
}
double dis(int x,int y)
{
    return sqrt((nd[x].x-nd[y].x)*(nd[x].x-nd[y].x)+(nd[x].y-nd[y].y)*(nd[x].y-nd[y].y));
}
int p[N],total;
double ans=10000000;
namespace dijkstra{
    double d[N];
    int ps[N];
    int vis[N];
    #define pii pair < int , int >
    #define mp make_pair
    priority_queue < pii , vector < pii > , greater < pii > > q;
    void dijkstra(int u,int v)
    {
        while(!q.empty())q.pop();
        for(int i=1; i<=n; i++)
        {
            d[i]=1000000000000;vis[i]=0;
        }
        d[1]=0;
        q.push(mp(0,1));
        while(!q.empty())
        {
            int x=q.top().second;
            if(vis[x])continue;
            q.pop();
            vis[x]=1;
            edge(i,x){
                double z;
                y=to[i].to;z=to[i].w;
                if(x==u&&y==v||x==v&&y==u)continue;
                if(d[y]>d[x]+z){
                    ps[y]=x;
                    d[y]=d[x]+z;
                    q.push(mp(d[y],y));
                }
            }
        }
        if(u==-1&&v==-1)
        {
            for(int i=n; i; i=ps[i])p[++total]=i;
           // for(int i=1; i<=total; i++)printf("%d ",p[i]);
            //cout<<endl;
        }else
        {
            ans=min(ans,d[n]);
        }
        //cout<<d[n]<<endl;

    }
}
int main()
{
    //freopen("text.in","r",stdin);
    scanf("%d%d",&n,&m);
    for(int i=1; i<=n; i++)nd[i].read();
    for(int i=1; i<=m; i++)
    {
        static int x,y;
        static double z;
        cin>>x>>y;
        z=dis(x,y);
        add(x,y,z);
        add(y,x,z);
    }
    dijkstra::dijkstra(-1,-1);
    for(int i=1; i<total; i++)
    {
        dijkstra::dijkstra(p[i],p[i+1]);
    }
    printf("%.2lf\n",ans);
    return 0;
}

标签:P1491,pii,int,double,位置,nd,dijkstra,集合,define
From: https://www.cnblogs.com/dadidididi/p/16802690.html

相关文章

  • 位置度具体怎么计算?实际生产中,定位孔的定位方式及位置度大小的选择
    在实际标注过程中,我们对孔位一般标识孔径公差和位置度公差,当标识了位置度公差时,很多人认为位置度控制了孔位的X/Y/Z三个方向的约束,但是,这种理解是正确的吗?若是你认为是正......
  • UMLChina答题赛第一赛季题目和答案集合(1-25轮)
    答题赛前25轮的优胜者:喻永和喻永和yuyjxa忠三工鸟龙龙龙龙萌yuyjx三工鸟忠anonymousanonymous三工鸟三工鸟某人龙龙熊某人&&木子龙龙忠。。。。。。......
  • map集合类型/实体类类型的参数
    map集合类型的参数若mapper接口中的方法需要的参数为多个时,此时可以手动创建map集合,将这些数据放在map中只需要通过${}和#{}访问map集合的键就可以获取相对应的值,注意${......
  • 【算法】贪心求解仓库设置位置问题(C++源码)
    【算法】贪心求解仓库设置位置问题(C++源码)​​一、问题描述​​​​二、步骤描述​​​​三、运行结果截图​​​​四、源代码(C++)​​一、问题描述城市街道如下图所示,所有街......
  • 【ORM】EF实用技巧集合
    1、延迟加载varquery1=_context.SysDataDict.Where(x=>x.BaseVersion.Equals(0)).ToList();varquery2=_context.SysDataDict.Where(x=>x.BaseVersion......
  • 面经:什么是Transformer位置编码?
     Datawhale干货 作者:陈安东,中央民族大学,Datawhale成员过去的几年里,Transformer大放异彩,在各个领域疯狂上分。它究竟是做什么,面试常考的Transformer位置编码暗藏什么玄机?本......
  • Python set集合基本操作(添加、删除、交集、并集、差集)
    Python set集合最常用的操作是向集合中添加、删除元素,以及集合之间做交集、并集、差集等运算,本节将一一讲解这些操作的具体实现。向set集合中添加元素set集合中添......
  • Python set集合方法详解(全)
    前面学习了set集合,本节来一一学习set类型提供的方法。首先,通过dir(set)命令可以查看它有哪些方法:>>>dir(set)['add','clear','copy','difference','difference......
  • Python set集合详解
    Python 中的集合,和数学中的集合概念一样,用来保存不重复的元素,即集合中的元素都是唯一的,互不相同。从形式上看,和字典类似,Python集合会将所有元素放在一对大括号{}中,相邻......
  • Nginx安装与各类配置集合
    安装vi/etc/yum.repos.d/nginx.repo#Stableversion[nginx]name=nginxrepobaseurl=http://nginx.org/packages/centos/7/$basearch/gpgcheck=0enabled=1#Mainlineversion......