社区讨论

为什么用Dijkstra跑最短路不行???

P1144最短路计数参与者 10已保存回复 17

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
17 条
当前快照
1 份
快照标识符
@mi6x4l96
此快照首次捕获于
2025/11/20 12:15
4 个月前
此快照最后确认于
2025/11/20 15:13
4 个月前
查看原帖
CPP
#include<queue>
#include<cstdio>
#include<cstring>
using namespace std;
const int N=1007,mod=100003;
struct Edge{
    int nxt,to;
}e[N<<2];
struct node{
    int u,d;
    bool operator <(const node& rhd) const {
        return d>rhd.d;
    }
};
priority_queue<node> Q;
int n,m,h[N<<2],t,ans[N],dis[N],js[N][N];
inline void addEdge(int u,int v){
    e[++t].to=v;
    e[t].nxt=h[u];
    h[u]=t;
}
inline void Dijkstra(){
    for(int i=1;i<=n;i++)
        dis[i]=2147483647;
    dis[1]=0;
    Q.push((node){1,0});
    while(!Q.empty()){
        node fr=Q.top();Q.pop();
        int u=fr.u,d=fr.d;
        if(d!=dis[u])
            continue;
        for(int i=h[u];i;i=e[i].nxt){
            int v=e[i].to;
            if(dis[v]==dis[u]+1)
                ans[v]=(ans[v]+js[u][v])%mod;
            if(dis[v]>dis[u]+1){
                dis[v]=dis[u]+1;
                Q.push((node){v,dis[v]});
                ans[v]=js[u][v];
            }
        }
    }
}
int main(){
    scanf("%d%d",&n,&m);
    while(m--){
        int a,b;
        scanf("%d%d",&a,&b);
        js[a][b]++;js[b][a]++;
        addEdge(a,b);addEdge(b,a);
    }
    Dijkstra();
    ans[1]=1;
    for(int i=1;i<=n;i++)
        printf("%d\n",ans[i]);
    return 0;
}

回复

17 条回复,欢迎继续交流。

正在加载回复...