1首先要注意一定要取模,尤其第4,5个测试点,如果60分很可能就是没有取模 2,自环要去掉。重边是有用的,就相当于俩条路。 3,bfs重要代码奉上
int mod=100003;
const int N=4e6+2;//链式前向星
int h[N],ne[N],e[N],idx;//
int st[N];//储存状态,是否已经求出最短路
int dis[N];//距离
long long cnt[N];//保存到i点的最短路的数量
void add(int a,int b){
e[idx]=b;
ne[idx]=h[a];
h[a]=idx++;
}
void bfs(){
queue<int>s;
s.push(1);
st[1]=1;dis[1]=0;cnt[1]=1;
while(!s.empty()){
int q=s.front();
s.pop();
for(int i=h[q];i!=-1;i=ne[i]){
int u=e[i];
if(!st[u]){//如果没被确定最短路,那么入队
st[u]=1;
dis[u]=dis[q]+1;
s.push(u);
cnt[u]+=cnt[q];//u点的最短路等于到qd点的最短路的数量
cnt[u]%=mod;//取模
}
else {
if(dis[q]==dis[u]-1)cnt[u]+=cnt[q];//如果已经确定最短路
cnt[u]%=mod;//并且这里的距离等于已经确定的最短路,那么加上
}
}
}
}
int main(){
int n,m;
memset(h,-1,sizeof h);
cin>>n>>m;
for(int i=0;i<m;i++){
int a,b;
cin>>a>>b;
if(a==b)continue;//重边去除
add(a,b);add(b,a);
}
}