dist2里存的是所有更新的路径值,dist存最短路径,我通过计算dist2里dist[i]的个数统计有多少条路是最短路径,但是答案不对
#include<bits/stdc++.h>
using namespace std;
int n,m,k,q;
const int maxn=1e6+10;
int s[maxn];
struct node
{
int u,w;
};
bool vis[maxn];
int dist[maxn];
vector<int> dist2[maxn];
vector<node> g[maxn];
void dijk(int s)
{
priority_queue<pair<int,int>,vector<pair<int,int>>,greater<pair<int,int>>>q;
for (int i = 0; i <= n; i++)dist[i] = (int)1e18;
dist[s]=0;
q.push({0,s});
while(q.size()!=0)
{
int u=q.top().second;
//只取了点,没有q.top.first=w,自己写的逻辑有点问题
//注意是top后有括号
//优先队列默认按第一个排序,所以pair的first要放权值
q.pop();
if(vis[u])continue;
vis[u]=1;
for(int i=0; i<g[u].size(); i++)
{
//i起始是0
//用u更新距离
int d=g[u][i].w;
int v=g[u][i].u;
if(dist[v]>dist[u]+d)
{
dist[v]=dist[u]+d;
dist2[v].push_back(dist[v]);
q.push({dist[v],v});
//记得把他放回去
}
}
}
}
int main()
{
cin>>n>>m;
while(m--)
{
int x,y;
cin>>x>>y;
g[x].push_back({y,1});
g[y].push_back({x,1});
}
dijk(1);
for(int i = 1; i <= n; i++) {
int min_dist = dist[i];
int count_min = count(dist2[i].begin(), dist2[i].end(), min_dist);
cout << count_min << endl;
}
// for(int i=1;i<=n;i++)
// { sort(dist2[i].begin(),dist2[i].end());
// int min=*(dist2[i].begin());
//
// cout<<dist2[i].count(min)<<endl;
// }
}