洛谷 1144 最短路计数

题意给一个图,问从1节点出发到所有i节点的最短路有多少条,边权都为1。

维护一个ans,如果dis[v]>dis[u]+1,那么ans[v]=ans[u]并更新距离。如果dis[v]==dis[u]+1,那么ans[v]+=ans[u]。

 

 

#include <bits/stdc++.h>
#define mem(x) memset(x,0,sizeof(x))
#define mem1(x) memset(x,-1,sizeof(x))
using namespace std;
const int M = 1e6+7;
const int inf = 2147483647;
const int mod = 100003;
int n,m;
int cnt,head[M],flag[M];
struct edge
{
    int v,next;
}e[M<<2];
void init(){
    cnt=0;mem1(head);
}
void add(int u,int v){
    e[++cnt].v=v;e[cnt].next=head[u];
    head[u]=cnt;
}
struct node
{
    int index,dis,ans;
    bool operator < (const node &k)const{
        return dis>k.dis;
    }
}d[M];
priority_queue<node> q;
void dijkstra(int s){
    for(int i=1;i<=n;i++) d[i].dis=inf,d[i].index=i,flag[i]=0,d[i].ans=0;
    d[s].dis=0;d[s].ans=1;q.push(d[s]);

    while(!q.empty()){
        int u=q.top().index;
        q.pop();
        if(flag[u]) continue;
        flag[u]=1;

        for(int i=head[u];~i;i=e[i].next){
            int v=e[i].v;
            if(d[v].dis>d[u].dis+1){
                d[v].ans=d[u].ans;
                d[v].dis=d[u].dis+1;
                q.push(d[v]);
            }
            else if(d[v].dis==d[u].dis+1){
                d[v].ans+=d[u].ans;
                d[v].ans%=mod;
            }
        }

    }

    for(int i=1;i<=n;i++) printf("%d\n",d[i].ans);
}
int main(){
    init();
    scanf("%d%d",&n,&m);
    for(int i=1;i<=m;i++){
        int from,to;
        scanf("%d%d",&from,&to);
        if(from==to) continue;
        add(from,to);add(to,from);
    }
    dijkstra(1);
    return 0;
}
View Code

 

posted @ 2018-08-29 15:37  LMissher  阅读(212)  评论(0)    收藏  举报