输出全是11111
查看原帖
输出全是11111
1233392
RY111楼主2024/8/5 15:53

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;
//	}
	
}

2024/8/5 15:53
加载中...