社区讨论

求助记忆化为什么不行

P1144最短路计数参与者 2已保存回复 4

讨论操作

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

当前回复
4 条
当前快照
1 份
快照标识符
@mhjsfdg6
此快照首次捕获于
2025/11/04 07:45
4 个月前
此快照最后确认于
2025/11/04 07:45
4 个月前
查看原帖
代码如下,求大佬解答,感激不尽!
CPP
#include <bits/stdc++.h>
#define endl '\n'
using namespace std;
typedef long long LL;
typedef pair<int,int> PII;


const int INF = 1e9;
const int N = 1e6+10,M = 2e6+10;
const int mod = 100003;

int h[N],ne[2*M],e[2*M],idx;
int rh[N];

class solution
{
    public:
        void solve();
};
void add(int a,int b)
{
    e[idx]=b,ne[idx]=h[a],h[a]=idx++;
    e[idx]=a,ne[idx]=rh[b],rh[b]=idx++;
}

void solution::solve()
{
    memset(h,-1,sizeof h);
    memset(rh,-1,sizeof rh);
    int n,m;cin>>n>>m;
    for(int i=1;i<=m;i++)
    {
        int a,b;cin>>a>>b;
        if(a==b)continue;
        add(a,b);
    }

    vector<int>dis(n+1,INF);

    auto dijkstra=[&](int st)
    {
        queue<int>q;
        vector<bool>vis(n+1,0);
        q.push(st);
        dis[st]=0;
        while(q.size())
        {

            int p = q.front();
            q.pop();

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

            for(int i=h[p];~i;i=ne[i])
            {
                int v=e[i];
                if(dis[v]>dis[p]+1)
                {
                    dis[v]=dis[p]+1;
                    q.push(v);
                }
            }

        }
    };

    dijkstra(1);
    // for(int i=1;i<=n;i++)
    //     cout<<dis[i]<<' ';
    vector<LL>f(n+1,-1);

    function<LL(int)>dfs=[&](int u)
    {
        if(f[u]!=-1)return f[u];
        f[u]=0;
        // cout<<u<<endl;
        for(int i=rh[u];~i;i=ne[i])
        {
            int v=e[i];
            // cout<<dis[v]<<' ';
            if(dis[v]==dis[u]-1)
            {
                f[u] = (f[u] + dfs(v))%mod;
            }
        }
        // cout<<endl; 
        return f[u];
    };
    f[1]=1;
    for(int i=1;i<=n;i++)
        cout<<dfs(i)<<endl;

}


signed main()
{
    ios_base::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
    int T = 1;
    solution AC;
    //cin>>T;
    while(T --)
    {
        AC.solve();
    }
    return 0;
}

回复

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

正在加载回复...