您的位置:首页 > 其它

[洛谷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;
}

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: