zoukankan      html  css  js  c++  java
  • 【题解】洛谷P2914[USACO08OCT]断电Power Failure

    洛谷P2914:https://www.luogu.org/problemnew/show/P2914

    这题目在暑假培训的时候考到
    当时用Floyed会T掉
    看楼下都是用Dijkstra
    难道没有人用优雅的SPFA吗?

    思路

    用前向星构建整个图
    注意每一条边都不能超过len(也就是题目中的m)
    所以存图的时候注意一下这一点就行了
    其他就跟SPFA一样套板子
    代码中还有详细注解
    注意坑点:数组开大一点 没开大的我RE了2次

    代码

    #include<iostream>
    #include<cstdio>
    #include<cmath>
    using namespace std;
    int n,m,cnt;
    double len;
    int exist[500005];//判断是否在队中 
    int team[2000020];//队列 
    int head[500005];
    double dis[500005];//从1到n的距离 
    int t=0,w=1;
    struct ele
    {
    	double x;
    	double y;
    }ele[100005];//电线杆的坐标 
    struct edge
    {
    	int next;
    	int to;
    	double w;
    }e[5000005]; 
    void add(int u,int v,double w)
    {
    	e[++cnt].w=w;
    	e[cnt].to=v;
    	e[cnt].next=head[u];
    	head[u]=cnt;
    }//前向星图 
    double dist(int i,int j)
    {
        double x1=ele[i].x;
        double y1=ele[i].y;
        double x2=ele[j].x;
        double y2=ele[j].y;
        double d=hypot(x1-x2,y1-y2);//判断电线杆之间的距离
    	                            //据楼下的dalao说用sqrt会爆就没用
    								//用了求直角三角形斜边长的函数<cmath> 
        return d;
    }
    int main()
    {
    	cin>>n>>m>>len;
    	for(int i=1;i<=n;i++)
    	cin>>ele[i].x>>ele[i].y;
    	for(int i=1;i<=n;i++)
    	dis[i]=99999999;//初始化 
    	for(int i=1;i<=n;i++)
    	for(int j=i+1;j<=n;j++)
    	{
    		if(dist(i,j)<=len)//如果没有超过len就可以加入边 
            {
    			add(i,j,dist(i,j));
    		    add(j,i,dist(i,j));
    		}
    	}
    	for(int i=1;i<=m;i++)
        {
            int x,y;
            cin>>x>>y;
            add(x,y,0);
    		add(y,x,0);//如果已经有电线就不用再花费距离 
        }
        dis[1]=0;//常规SPFA开始 
        team[1]=1;
        while(t<w)
        {
    		t++;
    		int u=team[t];
    		exist[u]=0;
    		for(int i=head[u];i;i=e[i].next)
    		{
    			int v=e[i].to;
    			if(dis[v]>dis[u]+e[i].w)
    			{
    				dis[v]=dis[u]+e[i].w;
    				if(!exist[v])
    				{
    					w++;
    					exist[v]=1;
    					team[w]=v;
    				}
    			}
    		}
    	}
    	if(dis[n]==99999999)//如果到不了 
    	cout<<"-1";
    	else
    	cout<<int(dis[n]*1000);//强制转换int类型 
    }
    
  • 相关阅读:
    【概念】构造函数和析构函数
    【概念】使用Fixed创建固定大小的缓冲区
    Sqoop
    Flume组件
    Hive节点及原理
    Yarn
    Hive数据倾斜
    单例
    工厂设计模式
    JVM对象创建
  • 原文地址:https://www.cnblogs.com/BrokenString/p/9296720.html
Copyright © 2011-2022 走看看