随笔 - 531  文章 - 0  评论 - 3  阅读 - 10215 

 

01bfs

 

 

跑完d1 ,d2 ( 单源最短路

枚举 中间点(去掉的点

复制代码
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <map>
using namespace std;
const int N =1e5+4;
#define int long long
#define inf 1e18
int n ,d1[N],d2[N],ans[N];

vector<int> g[N]; void add(int x,int y){ g[x].push_back(y);}

void bfs(int *dis,int v0){
    queue<int> q;for(int i=1;i<=n;i++) dis[i]=inf ;dis[v0]=0;
  
//
    q.push(v0) ;  
    while(q.size()){
        int x= q.front() ; q.pop() ; 
        for(int y :g[x])
            if(dis[x]+1<dis[y]){
                dis[y] =dis[x]+1; q.push(y);
            }
    }
}

 
 string s[N] ;
signed main(){
    int m ;
    cin>> n >>m;
    for(int i=1;i<=n;i++){
        cin>>s[i] ;
        for(int j=0;j<m;j++) 
            if(s[i][j]=='1') 
                add(i,i+j+1);
    }
    bfs(d1,1) ; 
    
    for(int i=1;i<=n;i++) g[i].clear() ;
    for(int i=1;i<=n;i++){
        for(int j=0;j<m;j++) 
            if(s[i][j]=='1') add(i+j+1,i);
    }
    bfs(d2,n) ;

    for(int i=2;i<n;i++){
            ans[i]= inf;
            for(int j=max(1ll,i-m+1);j<i;++j)
                for(int k=1;k<=m;++k)
                    if(j+k>i&&s[j][k-1]=='1')
                        ans[i]=min(ans[i],d1[j]+d2[j+k]+1ll);
    }
    for(int i=2;i<n;i++)
         cout <<(ans[i]==inf?-1:ans[i])<<' ';cout<<endl;
}
复制代码

 

 艹第一次写用了memset md

posted on   towboat  阅读(3)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示