Niuniu y balancín

Límite de tiempo: C / C ++ 1 segundo, otros idiomas 2 segundos
Límite de espacio: C / C ++ 262144K, otros idiomas 524288K
Formato de E / S de 64 bits:% lld
Inserte la descripción de la imagen aquí
es solo una línea, un entero no negativo, lo que significa moverse desde el primer balancín al enésimo balancín El número mínimo de saltos.

ingresar:

7
0 2 4
1 0 2
0 4 6
1 7 9
0 6 8
2 3 9
2 1 3

Producción:

Quinta
Inserte la descripción de la imagen aquí
idea: el camino más corto
Si todos los sectores están conectados, busque el camino más corto.
Si la plantilla aquí puede estar fragmentada, simplemente optimícela al guardar la imagen.
Primero, ordena todas las secciones de arriba a abajo y de izquierda a derecha.
Para cualquier parte de la plantilla k, solo necesitamos considerar dos casos de conexión, uno es la plantilla de la derecha y el otro es la plantilla de la siguiente línea.
Es fácil pensar en la plantilla de la misma industria considerando k + 1.
Hay un poco de codicia al considerar la plantilla de la siguiente línea. Para la plantilla k, si el intervalo de la plantilla conectado a ella en la siguiente línea es el bloque [l, r], al considerar la siguiente línea de la plantilla k + 1 en la derecha, basta con mirar El intervalo [r-1 ,?] no necesita comenzar desde el principio de la línea.

//最短路
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
queue <int > q;
int tot=0,s=-1,z=-1;
int head[100010];
int dis[100010];
struct ban
{
    
    
    int l,r,p,y;//左右边界,所在行,编号
}a[100010];

struct ty
{
    
    
    int next,t;
}edge[2000010];
void bfs()
{
    
    
    dis[s]=1;
    q.push(s);
    while( !q.empty() )
    {
    
    
        int x=q.front();
        q.pop();
        for(int i=head[x] ;i!=-1 ;i=edge[i].next)
        {
    
    
            int y=edge[i].t;
            if(!dis[y])
            {
    
    
            q.push(y);
            dis[y]=dis[x]+1;
            }
        }
    }
}
bool cmp(ban a, ban b) //从上到下,从左到右排序
{
    
    
    if(a.y!=b.y)    return a.y<b.y;
    else return a.l<b.l;
}

void addedge(int x, int y)
{
    
    
    edge[++tot].t=y;
    edge[tot].next=head[x];
    head[x]=tot;
}
int main()
{
    
    
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);

    memset(edge,-1,sizeof(edge));
    memset(head,-1,sizeof(head));

    int n;
    cin>>n;
    for(int i=1; i<=n ;i++)
    {
    
    
        cin>>a[i].y>>a[i].l>>a[i].r;
        a[i].p=i;
    }
    sort(a+1,a+1+n,cmp);
//    for(int i=1; i<=n ;i++)
//        cout<<a[i].p<<" ";
//        cout<<endl;
int l=1,r=1;
    for(int i=1; i<=n ;i++)
    {
    
    
        if(a[i].p==1 )  s=i;//存起点终点
        if(a[i].p==n )  z=i;
        //同一行的矩形联结
        if( a[i].y== a[i+1].y && a[i].r==a[i+1].l)
        {
    
    
            addedge(i,i+1);
            addedge(i+1,i);
        }
        //当前模块和下一行的模块,贪心优化联结操作

        while( l<=n && a[l].y==a[i].y ) l++;
        r=max(l,r);
        while( r<=n && a[r].y==a[l].y)  r++;
        for(; l<r ;l++)
        {
    
    

            if(a[l].l>=a[i].r)  break;
            if(a[l].r<=a[i].l)  continue;
            addedge(i,l);
            addedge(l,i);
        }
        if( l >1 )  l--;
    }
        //存完图,广搜求最短路
    bfs();
    cout<<dis[z]-1<<endl;
}

Supongo que te gusta

Origin blog.csdn.net/m0_53688600/article/details/113854602
Recomendado
Clasificación