[洛谷1144]最短路计数
2017-07-27 08:35
375 查看
思路:
Dijkstra求最短路,同时统计最短路个数,当新增最短路时,增加的条数是父亲结点的条数。
#include<cstdio> #include<cctype> #include<vector> #include<functional> #include<ext/pb_ds/priority_queue.hpp> inline int getint() { char ch; while(!isdigit(ch=getchar())); int x=ch^'0'; while(isdigit(ch=getchar())) x=(((x<<2)+x)<<1)+(ch^'0'); return x; } const int N=1000000,inf=0x7fffffff,mod=100003; std::vector<int> e ; inline void add_edge(const int u,const int v) { e[u].push_back(v); e[v].push_back(u); } struct Vertex { int id,d,ans; bool operator > (const Vertex &x) const { return d>x.d; } }; __gnu_pbds::priority_queue<Vertex,std::greater<Vertex> > q; __gnu_pbds::priority_queue<Vertex,std::greater<Vertex> >::point_iterator p ; bool v ={0}; int main() { int n=getint(),m=getint(); while(m--) { add_edge(getint(),getint()); } for(int i=1;i<=n;i++) { p[i]=q.push((Vertex){i,(i==1)?0:inf,(i==1)?1:0}); } for(Vertex u=q.top();u.d!=inf;u=q.top()) { for(unsigned int i=0;i<e[u.id].size();i++) { if(v[e[u.id][i]]) continue; int &v=e[u.id][i]; if(u.d+1<p[v]->d) { q.modify(p[v],(Vertex){v,u.d+1,p[u.id]->ans%mod}); } else if(u.d+1==p[v]->d) { q.modify(p[v],(Vertex){v,p[v]->d,(p[v]->ans+p[u.id]->ans)%mod}); } } q.modify(p[u.id],(Vertex){u.id,inf,u.ans}); v[u.id]=true; } for(int i=1;i<=n;i++) { printf("%d\n",p[i]->ans); } return 0; }
相关文章推荐
- 洛谷 1144 最短路计数 bfs
- 【SPFA】洛谷1144 最短路计数
- 洛谷 1144 最短路计数 bfs
- 洛谷 1144 最短路计数 bfs
- 洛谷 1144 最短路计数 bfs
- 洛谷 1144 最短路计数 bfs
- 洛谷 1144 最短路计数 bfs
- 洛谷 1144 最短路计数 bfs
- 洛谷 1144 最短路计数 bfs
- 【洛谷1144】最短路计数 最短路
- (洛谷 1144)最短路计数
- [洛谷 1144]最短路计数---spfa+记忆化搜索
- 洛谷 1144 最短路计数 bfs
- 最短路计数_洛谷1144_最短路
- 洛谷 1144 最短路计数 bfs
- 洛谷 1144 最短路计数 bfs
- 洛谷1144 最短路计数
- 洛谷 1144 最短路计数 bfs
- 洛谷 1144 最短路计数 bfs
- spfa+dp(洛谷1144 最短路计数)