【问题描述】
给出 n 个顶点(编号为1..n),m 条边的无向无权图,请计算 1 到 n 的最短路径数目(只要有一条边不同,就是两条不同的路径)。
【输入格式】
第一行包含两个整数:n,m,表示图的顶点和边的数目。
接下来的m行,每行包含2个整数:a,b((1 ≤ a, b ≤ n),表示图的一条边关联的顶点为a,b。
【输出格式】
一个整数,表示 1 到 n 的最短路径数目。
【输入样例】
6 9
1 2
1 3
1 4
2 5
2 6
2 3
3 6
4 6
3 5
【输出样例】
3
【数据范围】
n<=50000 , 1<=m<=100000
【来源】
某中华名校Mr_He原创。
#include<cstdio>
#include<vector>
#include<cstring>
#define maxn 100005
using namespace std;
int n,m,x,y,front,rear;
int dist[maxn]={0},num[maxn]={0},q[maxn*10];
bool vis[maxn]={0};
vector<int>g[maxn];
void fuck()
{
front=rear=1;
vis[1]=1;
dist[1]=0;
num[1]=1;
q[rear++]=1;
while(rear!=front)
{
int i=q[front++];
for(int j=0;j<g[i].size();j++)
{
int k=g[i][j];
if(vis[k])
{
if(dist[i]+1==dist[k]) num[k]+=num[i];
continue;
}
vis[k]=true;
num[k]=num[i];
dist[k]=dist[i]+1;
q[rear++]=k;
}
}
}
int main()
{
//freopen("in.txt","r",stdin);
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
{
scanf("%d%d",&x,&y);
g[x].push_back(y);
g[y].push_back(x);
}
fuck();
printf("%d",num[n]);
return 0;
}