用了一个和《dijkstra、heap+dijkstra、扩展应用》这篇文章中不同的最短路条数统计方式。如下。
import java.io.*;
import java.util.*;
public class Main {
static int INF=0x3f3f3f3f,MAXN=1000005,n,m;
static int count[]=new int[MAXN];
static Vector<Edge> G[]=new Vector[MAXN];
static StreamTokenizer in=new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
static int d[]=new int[MAXN];
public static void main(String args[]) throws IOException {
solve();
}
public static void solve() throws IOException {
n=nextInt();
m=nextInt();
for(int i=1;i<=n;i++){
G[i]=new Vector<>();
}
for(int i=0;i<m;i++){
int u=nextInt();
int v=nextInt();
Edge e1=new Edge(u,1);
G[v].add(e1);
Edge e2=new Edge(v,1);
G[u].add(e2);
}
Dij();
for(int i=1;i<=n;i++){
System.out.println(count[i]);
}
}
static class Edge{
int v;
int w;
public Edge(int v,int w){
this.v=v;
this.w=w;
}
}
static void Dij(){
for(int i=1;i<=n;i++){
d[i]=INF;
}
d[1]=0;
PriorityQueue<Node> Q=new PriorityQueue<Node>();
Q.add(new Node(1,0));
while(!Q.isEmpty()){
Node u=Q.poll();
if(u.w==d[u.id]){
count[u.id]++;
}
if(u.w>d[u.id])continue;
for(Edge e:G[u.id]){
if(d[e.v]>=d[u.id]+e.w){
d[e.v]=d[u.id]+e.w;
Q.add(new Node(e.v,d[e.v]));
}
}
}
}
static class Node implements Comparable<Node>{
int id;
int w;
public Node(int id,int w){
this.id=id;
this.w=w;
}
@Override
public int compareTo(Node o) {
return this.w-o.w;
}
}
static int nextInt() throws IOException {
in.nextToken();
return (int)in.nval;
}
static long nextLong() throws IOException {
in.nextToken();
return (long)in.nval;
}
static String next() throws IOException{
in.nextToken();
return in.sval;
}
}