P1144最短のカウント・BFS /ダイクストラ

問題の解決策

実際に、私は、非常に単純な話題を書き、ここからタイトルトラックで学んだ知識を要約していません。

  1. 最短経路の右側1:00である場合、ダイクストラ/ spfaはBFSあります
  2. 、内部構造が対優先キューである場合<整数、整数>場合、DIS [V] = DIS [ U] +1 、これは新たな最短経路となり、高優先度キュー内のこの道路のレベルの変化が使用されるべきであるようにq.push(make_pair{-dis[v],v})そこにマイナスああ!

ここに画像を挿入説明


BFSのバージョン:


ダイクストラバージョン:

#include <bits/stdc++.h>
using namespace std;
typedef pair<int,int> pii;
const int INF=0x3f3f3f3f;
const int mod=100003;
const int N=1e6+10;
vector<int>g[N];
int vis[N],dis[N];
int ans[N];
int n,m;
priority_queue< pii >q;
void dijkstra(){
    memset(dis, INF, sizeof dis);
    dis[1]=0;
    ans[1]=1;

    q.push({0,1});
    while(q.size()){
        int u=q.top().second;
        q.pop();

        if(vis[u])continue;
        vis[u]=1;

        for (int i = 0; i <g[u].size(); i++) {
            int v=g[u][i];
            if(dis[v]>dis[u]+1){
                dis[v]=dis[u]+1;
                ans[v]=ans[u];
                q.push({-dis[v],v});
                //更新之后的点是新的最短路 优先级别变高 应该跑到队列最前方 用-dis[v]控制
                //dis[v]的值是没有变 仍然是正的
            }else if( dis[v]==dis[u]+1){
                ans[v]=(ans[v]+ans[u])%mod;
            }
        }
    }
}
int main()
{
    cin>>n>>m;
    for (int i = 1,u,v; i <= m; i++) {
        cin>>u>>v;
        g[u].push_back(v);
        g[v].push_back(u);
    }

    dijkstra();
    for (int i = 1; i <=n ; i++) {
        cout<<ans[i]<<endl;
    }
    return 0;
}
公開された43元の記事 ウォンの賞賛0 ビュー1259

おすすめ

転載: blog.csdn.net/Yubing792289314/article/details/104024173