ac了警告后人,给个详细bfs的解法
  • 板块P1144 最短路计数
  • 楼主stmo
  • 当前回复2
  • 已保存回复2
  • 发布时间2023/12/14 21:06
  • 上次更新2023/12/14 22:59:25
查看原帖
ac了警告后人,给个详细bfs的解法
1090758
stmo楼主2023/12/14 21:06

1首先要注意一定要取模,尤其第4,5个测试点,如果60分很可能就是没有取模 2,自环要去掉。重边是有用的,就相当于俩条路。 3,bfs重要代码奉上

int mod=100003;
const int N=4e6+2;//链式前向星
int h[N],ne[N],e[N],idx;//
int st[N];//储存状态,是否已经求出最短路
int dis[N];//距离
long long cnt[N];//保存到i点的最短路的数量
void add(int a,int b){
    e[idx]=b;
    ne[idx]=h[a];
    h[a]=idx++;
}
void bfs(){
    queue<int>s;
    s.push(1);
    st[1]=1;dis[1]=0;cnt[1]=1;
    while(!s.empty()){
        int q=s.front();
        s.pop();
        for(int i=h[q];i!=-1;i=ne[i]){
            int u=e[i];
            if(!st[u]){//如果没被确定最短路,那么入队
                st[u]=1;
                dis[u]=dis[q]+1;
                s.push(u);
                cnt[u]+=cnt[q];//u点的最短路等于到qd点的最短路的数量
                cnt[u]%=mod;//取模
            }
            else {
                if(dis[q]==dis[u]-1)cnt[u]+=cnt[q];//如果已经确定最短路
                cnt[u]%=mod;//并且这里的距离等于已经确定的最短路,那么加上
            }
        }
    }
}
int main(){
    int n,m;
    memset(h,-1,sizeof h);
    cin>>n>>m;
    for(int i=0;i<m;i++){
        int a,b;
        cin>>a>>b;
        if(a==b)continue;//重边去除
        add(a,b);add(b,a);
    } 
}
2023/12/14 21:06
加载中...