题意
题目跳楼机
给你 $n$ 个点,每个点有一个编号。每个节点也有一个路径编号,长度为 $6$ 位,构造为:这个节点的编号保留 $6$ 位,不足为 $0$ 代替(数据保证节点编号不会溢出)。
请你求从 $000000$ 到每一个点的路径编号并列存为一个字符串,转为 int 后对 $998244353$ 取模。
分析
考虑使用 dfs。
可以先将边从小到大排序,这样第一次到达这个点的时候路径的字典序肯定是最小的。
这里我用的是邻接表存图,接下来就是 dfs,每次将路径串加上当前的编号就行。
细节:如何将 int 后面加一串数字?可以尝试将原来数字 $\times10^6$ 之后再加就可以实现 int 的在末尾增加数字。
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
| #include<bits/stdc++.h> #define mod 998244353 #define ll long long using namespace std; int n,m; vector<int> g[1000005]; ll ans[1000005]; bool vis[1000005]; void dfs(int u,ll now){ ans[u]=now; for(auto v:g[u]){ if(ans[v]!=-1)continue; dfs(v,(now*1000000+v)%mod); } } int main(){ cin>>n>>m; for(int i=1;i<=m;i++){ int x=0,y=0; for(int j=1;j<=6;j++){ char q; cin>>q; x=x*10+q-48; } for(int j=1;j<=6;j++){ char q; cin>>q; y=y*10+q-48; } if(x==y){ continue; } g[x].push_back(y); g[y].push_back(x); } memset(ans,-1,sizeof ans); for(int i=0;i<=n;i++){ sort(g[i].begin(),g[i].end()); } dfs(0,0); for(int i=1;i<n;i++){ cout<<ans[i]<<"\n"; } return 0; }
|
TIPS
记得处理重边和自环。