注意看题目的数据范围!!!!!!!!!
不难发现这是一个稀疏图
而堆优化版dijkstra适合稀疏图
那还想什么,直接堆优化上就完事了
不过我使用的是优先队列,没有手写堆~~~~~
#include<bits/stdc++.h>

using namespace std;

const int maxn=1.5e5;  
int e[maxn],ne[maxn],h[maxn],dis[maxn],idx,w[maxn];
bool vis[maxn];
int n,m;
typedef pair<int ,int >PII;
void add(int a,int b,int c)
{
    e[idx]=b;w[idx]=c;ne[idx]=h[a];h[a]=idx++;
}

int  dijkstra()
{
    memset(dis,0x3f,sizeof dis);
    priority_queue<PII,vector<PII>,greater<PII>>mo;
    dis[1]=0;
    mo.push({0,1});
    while(mo.size())
    {
        auto t=mo.top();
        mo.pop();
        int ver=t.second,distance=t.first;
        if(vis[ver]) continue;
        vis[ver]=1;
        for(int i=h[ver];i!=-1;i=ne[i])
        {
            int j=e[i];
            if(dis[j]>w[i]+distance)
            {
                 dis[j]=w[i]+distance;
                 mo.push({dis[j],j});
            }
        }
    }
    if(dis[n]==0x3f3f3f3f) return -1;
    else return dis[n];
}
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    memset(h,-1,sizeof h);
    int x,y,z,i;
    cin>>n>>m;
    for(i=0;i<m;i++){
        cin>>x>>y;
        add(x,y,1);
        add(y,x,1);
    }
    cout<<dijkstra()<<endl;
}