Dijkstra WA57分求助
查看原帖
Dijkstra WA57分求助
809165
The_Wandering_Earth楼主2023/8/8 15:14

rt,做法跟题解中差不多,样例都能够,但是#16,#19WA了

#include<bits/stdc++.h>

using namespace std;

int n, m, s, t, minn = 1000000000;
vector< pair<int, int> > g[20005];
int ans[20005][105], vis[20005][105];

struct node
{
	int u, w, s;
	bool operator < (const node &a)const
	{
		return w > a.w;
	}
};

priority_queue<node> q;

void dijkstra()
{
	memset(ans, 127, sizeof(ans));
	q.push(node{t, 0, 0});
	vis[t][0] = 1, ans[t][0] = 0;
	int x = n - 1;
	while(x--)
	{
		int u = q.top().u, w = q.top().w, m = q.top().s;
		q.pop();
		//cout << u << " " << w << " " << m << endl;
		vis[u][m] = 1;
		if(m == 100)
		{
			minn = min(minn, ans[u][m]);
			continue;
		} 
		for(int i = 0; i < g[u].size(); i++)
		{
			//cout << i << endl;
			int v = g[u][i].first, num = g[u][i].second;
			if(ans[v][m + 1] > num / (m + 1) + ans[u][m])
			{
				//cout << "11111" << endl;
				ans[v][m + 1] = num / (m + 1) + ans[u][m];
				if(!vis[v][m + 1])
				{
					//cout << v << " " << ans[v] << " " << m + 1 << endl;
					q.push(node{v, ans[v][m + 1], m + 1});
				}
			}
		}
	}
}

int main()
{
	cin >> n >> m >> s >> t;
	for(int i = 1; i <= m; i++)
	{
		int u, v, w;
		cin >> u >> v >> w;
		g[u].push_back(make_pair(v, w));
		g[v].push_back(make_pair(u, w));
	}
	dijkstra();
	for(int i = 1; i <= 100; i++)
	{
		minn = min(minn, ans[s][i]);
	}
	cout << minn;
	return 0;
}
2023/8/8 15:14
加载中...