1 条题解
-
0
思路
单源最短路
,本题可以使用bfs
来解决,只需要将板子稍加修改即可。我们设 为点 到 的最短路长度,初始
设 为最短路条数,初始
如果当前遍历到的节点为 ,它的上一个节点为 ,那么:
- 如果 ,说明点 之前没有被遍历过,那么我们令 ,;
- 如果 ,说明最短路长度相同(存在环),那么我们令 ,加上取模就是 。
这其实也是应用了
动态规划
的思想。AC Code
#include<bits/stdc++.h> #define ll long long using namespace std; const ll N=1e6+5,MOD=100003; ll n,m,pa[N],cnt[N]; vector<ll> vec[N]; queue<ll> q; int main(){ scanf("%lld%lld",&n,&m); for(ll i=1,u,v;i<=m;i++) scanf("%lld%lld",&u,&v),vec[u].push_back(v),vec[v].push_back(u); // 初始化数组 memset(pa,0x3f,sizeof(pa)); pa[1]=0,cnt[1]=1; q.push(1); // 将初始点加入队列 while(!q.empty()){ ll x=q.front(); q.pop(); for(auto i=vec[x].begin();i!=vec[x].end();i++) // 按照上述思路判断 if(pa[*i]>pa[x]+1){ pa[*i]=pa[x]+1; cnt[*i]=cnt[x]; q.push(*i); }else if(pa[*i]==pa[x]+1) cnt[*i]=(cnt[*i]+cnt[x])%MOD; } for(ll i=1;i<=n;i++) printf("%lld\n",cnt[i]); return 0; }
- 1
信息
- ID
- 735
- 时间
- 1000ms
- 内存
- 512MiB
- 难度
- 4
- 标签
- 递交数
- 100
- 已通过
- 47
- 上传者