洛谷p1144最短路计数
题目链接:https://www.luogu.com.cn/problem/P1144
对于一些特殊问题我们是要特殊处理的,正如我们特殊对待一些事一样;
首先这道题是处理无权无向图的;对于这类问题,可以把每个边的权值都设为1,那bfs是解决这一类问题的最好最短路径算法,只能是无权无边图,特殊处理了;
所以说这题就成了裸题,就好处理了。
Talk is cheap. Show me the code.
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int MAX=1e6; 4 const int INF=0x3f3f3f3f; 5 int n,m; 6 const int mod=1e5+3; 7 int ans[MAX]; 8 int dis[MAX]; 9 bool vis[MAX]; 10 vector<int> e[MAX]; 11 void bfs(int s){ 12 ans[s]=1,vis[s]=1; 13 queue<int> q; 14 q.push(s); 15 while(!q.empty()){ 16 int x=q.front(); 17 q.pop(); 18 for(int i=0;i<e[x].size();i++){ 19 int y=e[x][i]; 20 if(!vis[y]){ 21 dis[y]=dis[x]+1; 22 vis[y]=1; 23 q.push(y); 24 } 25 if(dis[y]==dis[x]+1){ 26 ans[y]+=ans[x]; 27 ans[y]%=mod; 28 } 29 } 30 } 31 } 32 33 34 int main(){ 35 std::ios::sync_with_stdio(false); 36 scanf("%d%d",&n,&m); 37 int a,b; 38 for(int i=0;i<m;i++){ 39 scanf("%d%d",&a,&b); 40 e[a].push_back(b); 41 e[b].push_back(a); 42 } 43 bfs(1); 44 for(int i=1;i<=n;i++){ 45 printf("%d\n",ans[i]); 46 } 47 return 0; 48 }
当然,这类题也可以用dijkstra来处理,不过既然有了最优选择,何必去选择多余的呢,是吧,
如果要是用dijkstra亦可以,前提是用优队优化,否则卡4个点
本文来自博客园,作者:江上舟摇,转载请注明原文链接:https://www.cnblogs.com/LQS-blog/p/16206505.html