思路是从 t 往 s 跑最短路,每次遇到一条边都判断一下 w/k ,不知道为啥会寄,test 11-13 、15过了,求神调教。
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int MAXN=4e4+10;
const int INF=0x3f3f3f3f3f3f3f;
struct node{
int nxt;
int to;
int w;
}g[MAXN];
int head[MAXN],tot,n,m,s,t;
bool vis[MAXN];
void add(int a,int b,int c){
tot++;
g[tot].w=c;
g[tot].nxt=head[b];
g[tot].to=a;
head[b]=tot;
}
int k=1;
vector<int>dijkstra(int s){
vector<int>dis(n+1,INF);
priority_queue<pair<int,int>,vector<pair<int,int> >,greater<pair<int,int> > >q;
dis[s]=0;
q.push(make_pair(0,s));
while(!q.empty()){
pair<int,int>tmp=q.top();
int u=tmp.second;
q.pop();
if(vis[u])continue;
vis[u]=1;
for(int i=head[u];i;i=g[i].nxt){
int v=g[i].to;
double hurt=(double)(g[i].w)/k;
if(dis[v]>dis[u]+floor(hurt)){
dis[v]=dis[u]+floor(hurt);
k++;
q.push(make_pair(dis[v],v));
}
}
}
return dis;
}
signed main(){
cin >> n >> m >> s >> t;
int xx,yy,zz;
for(int i=1;i<=m;i++){
cin >> xx >> yy >> zz;
add(xx,yy,zz);
add(yy,xx,zz);
}
vector<int>dis=dijkstra(t);
cout << dis[s] << endl;
return 0;
}