RT
最短路计数
给出一个N个顶点M条边的无向无权图,顶点编号为1~N。问从顶点1开始,到其他每个点的最短路有几条。
输入输出格式
输入格式:
输入第一行包含2个正整数N,M,为图的顶点数与边数。
接下来M行,每行两个正整数x, y,表示有一条顶点x连向顶点y的边,请注意可能有自环与重边。
输出格式:
输出包括N行,每行一个非负整数,第i行输出从顶点1到顶点i有多少条不同的最短路,由于答案有可能会很大,你只需要输出mod 100003后的结果即可。如果无法到达顶点i则输出0。
样例
输入: 输出:
5 7 1
1 2 1
1 3 1
2 4 2
3 4 4
2 3
4 5
4 5
OK,一看这题就是。。。。
一个单元最短路,然后....就不会了QAQ
其实思考SPFA的做法,每次更新是都是拿最小边更新
如果边长度一样,不就是多了一条最短路???
有点道理;
#include <cstdio> #include <algorithm> #include <queue> using namespace std; struct data{int v,nxt;}edge[2000010]; int cnt,alist[1000010]; inline void add(int u,int v) { edge[++cnt].v=v;edge[cnt].nxt=alist[u]; alist[u]=cnt; } int n,m; queue <int> q;int d[1000010];bool book[1000010]; int ans[1000010]; int main() { // freopen("in","r",stdin); scanf("%d%d",&n,&m); for(int i=1;i<=m;++i) { int v,u; scanf("%d%d",&v,&u); ///双向边 add(v,u); add(u,v); } for(int i=1;i<=n;++i) d[i]=0x3f3f3f3f; d[1]=0;ans[1]=1;q.push(1);book[1]=true; //初值为1 while(!q.empty()) { int now=q.front();q.pop();book[now]=false; int nxt=alist[now]; while(nxt) { int v=edge[nxt].v; if(d[v]>d[now]+1) { d[v]=d[now]+1; ans[v]=ans[now]; if(!book[v]){q.push(v);book[v]=true;} } else if(d[v]==d[now]+1) //边长一样时,+1s { ans[v]=(ans[v]+ans[now])%100003; } nxt=edge[nxt].nxt; } } for(int i=1;i<=n;++i)printf("%d\n",ans[i]); }
10:33:08