30pts求助
查看原帖
30pts求助
542698
封禁用户楼主2023/8/7 13:03
#include<bits/stdc++.h>
#define Queue pair<int,pair<int,int> >
using namespace std;
const int MAXN=20005,MAXM=80005;
int n,m,s,t;
int head[MAXN],dis[205][MAXN],vis[205][MAXN],cnt;
inline void read(int &x)
{
	x=0;bool f=0;char c=getchar();
	while(c<'0'||c>'9')
	{
		if(c=='-')f=1;
		c=getchar();
	}
	while(c>='0'&&c<='9')
	{
		x=(x<<3)+(x<<1)+(c&15);
		c=getchar();
	}
	x=f?-x:x;
}
struct node
{
	int num,to,nxt;
};
node edge[MAXM];
void add(int u,int v,int w)
{
	edge[++cnt]={w,v,head[u]};
	head[u]=cnt;
}
priority_queue<Queue,vector<Queue>,greater<Queue> >q;
void dijkstra()
{
	dis[0][s]=0;
	q.push({s,{0,0}});
	while(!q.empty())
	{
		Queue temp=q.top();
		q.pop();
		int id=temp.first,k=temp.second.first;
		if(vis[k][id])continue;
		vis[k][id]=1;
		if(k>100)continue;
		for(int i=head[id];i!=0;i=edge[i].nxt)
		{
			if(dis[k][id]+edge[i].num/(k+1)<dis[k+1][edge[i].to])
			{
				dis[k+1][edge[i].to]=dis[k][id]+edge[i].num/(k+1);
				q.push({edge[i].to,{k+1,dis[k+1][edge[i].to]}});
			}
		}
	}
}
int main()
{
	read(n),read(m),read(t),read(s);
	memset(dis,0x3f,sizeof dis);
	for(int i=0;i<m;i++)
	{
		int u,v,w;
		read(u),read(v),read(w);
		add(u,v,w);
		add(v,u,w);
	}
	dijkstra();
	int ans=0x3f3f3f3f;
	for(int i=0;i<=101;i++)ans=min(ans,dis[i][t]);
	cout<<ans;
}

提交记录

2023/8/7 13:03
加载中...