玄关,站外题求调
  • 板块灌水区
  • 楼主Rannio
  • 当前回复1
  • 已保存回复1
  • 发布时间2024/2/24 23:12
  • 上次更新2024/2/25 12:21:45
查看原帖
玄关,站外题求调
740333
Rannio楼主2024/2/24 23:12

输入数据 1

3 2
0 2
1 2

输出数据 1

-1 -1 2

输入数据 2

5 5
1 2
1 3
3 4
4 5
0 2

输出数据 2

3 3 3 3 2
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m,op,kp[300005];
int dis1[300005],dis2[300005];
int head[600005],cnt=1;
bool vis1[300005],vis2[300005];
int ans;
struct node{
    int to,next,val;
}edge[600005];
void add(int x,int y,int z){
    edge[cnt].val=z;
    edge[cnt].to=y;
    edge[cnt].next=head[x];
    head[x]=cnt++;
}
void bfs1(){
    memset(dis1,0x3f,sizeof(dis1));
    queue<int> q;
    dis1[1]=0;
    q.push(1);
    while(q.size()){
        int u=q.front();
        q.pop();
        if(vis1[u]) continue;
        vis1[u]=1;
        for(int i=head[u];i;i=edge[i].next){
            int v=edge[i].to;
            if(vis1[v]) continue;
            dis1[v]=dis1[u]+1;
            q.push(v);
        }
    }
}
void bfs2(){
    memset(dis2,0x3f,sizeof(dis2));
    queue<int> q;
    dis2[n]=0;
    q.push(n);
    while(q.size()){
        int u=q.front();
        q.pop();
        if(vis2[u]) continue;
        vis2[u]=1;
        for(int i=head[u];i;i=edge[i].next){
            int v=edge[i].to;
            if(vis2[v]) continue;
            dis2[v]=dis2[u]+1;
            q.push(v);
        }
    }
}
signed main(){
    scanf("%lld%lld",&n,&m);
    for(int i=1;i<=m;i++){
        int x,y;
        scanf("%lld%lld",&x,&y);
        if(x!=0&&y!=0){
            add(x,y,1);
            add(y,x,1);
        }
        else{
            kp[++op]=y;
        }
    }
    bfs1();
    bfs2();
    ans=dis1[n];
    int num1=0x3f3f3f3f3f,num2=0x3f3f3f3f3f;
    for(int i=1;i<=op;i++){
        num1=min(num1,dis1[kp[i]]);
        num2=min(num2,dis2[kp[i]]);
    }
    for(int i=1;i<=n;i++){
        int x=min(ans,min(dis1[i],num1+1)+min(dis2[i],num2+1));
        printf("%lld ",x>=0x3f3f3f3f3f?-1:x);
    }
    return 0;
}
2024/2/24 23:12
加载中...