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