2 条题解

  • 1
    @ 2025-11-20 17:23:43
    #include<bits/stdc++.h>
    using namespace std;
    const int N=1e6+10,mod=100003;
    int n,m,dis[N],ans[N],vis[N];
    vector<int> G[N];
    queue<int> q;
    void SPFA(){
        memset(dis,0x3f,sizeof(dis));
        dis[1]=0;
        ans[1]=1;
        q.push(1);
        vis[1]=1;
        while(!q.empty()){
            int u=q.front();
            q.pop();
            vis[u]=0;
            for(int v:G[u]){
                if(dis[v]>dis[u]+1){
                    dis[v]=dis[u]+1;
                    ans[v]=ans[u];
                    if(!vis[v]){
                        q.push(v);
                        vis[v]=1;
                    }
                }
                else if(dis[v]==dis[u]+1){
                    ans[v]=(ans[v]+ans[u])%mod;
                }
            }
        }
        return ;
    }
    int main(){
        ios::sync_with_stdio(0);cin.tie(nullptr);cout.tie(nullptr);
        cin>>n>>m;
        for(int i=1;i<=m;i++){
            int x,y;
            cin>>x>>y;
            G[x].push_back(y);
            G[y].push_back(x);
        }
        SPFA();
        for(int i=1;i<=n;i++){
            cout<<ans[i]<<"\n";
        }
        return 0;
    }
    
    
    
    • -1
      @ 2024-11-17 19:40:11

      更新答案数组时,如果边权不一样则直接更新掉,如果相等则叠加,最后取模

      #include<bits/stdc++.h>
      #define ll long long
      #define endl '\n'
      #define up(i,j,k,l) for(int i=j;i<=k;i+=l)
      #define down(i,j,k,l) for(int i=j;i>=k;i-=l)
      using namespace std;
      const int N=1e6+10,MOD=100003;
      int n,m;
      int u,v;
      vector<int> vc[N];
      queue<int> q;
      int d[N],s[N];
      bool f[N];
      void spfa()
      {
      	memset(d,0x3f3f3f,sizeof d);
      	d[1]=1;
      	f[1]=true;
      	s[1]=1;
      	q.push(1);
      	while(!q.empty()){
      		u=q.front();
      		q.pop();
      		f[u]=false;
      		for(auto fw:vc[u]){
      			if(d[fw]>d[u]+1){
      				d[fw]=d[u]+1;
      				s[fw]=s[u];
      				if(f[fw]==false){
      					f[fw]=true;
      					q.push(fw);
      				}
      			}
      			else if(d[fw]==d[u]+1){
      				s[fw]+=s[u];
      				s[fw]%=MOD;
      			}
      		}
      	}	
      	return;
      }
      void solve()
      {	
      	cin>>n>>m;
      	up(i,1,m,1){
      		cin>>u>>v;
      		vc[u].push_back(v);
      		vc[v].push_back(u);
      	}
      	spfa();
      	up(i,1,n,1){
      		s[i]%=MOD;
      		cout<<s[i]<<endl;
      	}
      	return;
      }
      int main()
      {
          //ios::sync_with_stdio(false);
      	//cin.tie(0);
      	//freopen(".in","r",stdin);
      	//freopen(".out","w",stdout);
      	int _=1;
      	//cin>>_;
      	up(i,1,_,1){
      		solve();
      	}
      	return 0;
      }
      
      • 1

      信息

      ID
      5202
      时间
      1000ms
      内存
      512MiB
      难度
      6
      标签
      递交数
      22
      已通过
      14
      上传者