关于刚才的C
查看原帖
关于刚才的C
423520
wizard(偷开O2楼主2023/8/6 18:07

思路是从 tt 往 ss 跑最短路,每次遇到一条边都判断一下 w/kw/k ,不知道为啥会寄,testtest 1111-1313 、1515过了,求神调教。

#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;
}
2023/8/6 18:07
加载中...