社区讨论

只有36……求助

P2939[USACO09FEB] Revamping Trails G参与者 3已保存回复 3

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
3 条
当前快照
1 份
快照标识符
@mi85z1y3
此快照首次捕获于
2025/11/21 09:10
4 个月前
此快照最后确认于
2025/11/21 09:10
4 个月前
查看原帖
(而且还re了一个点)
用了二维dj

CPP
#include<iostream>
#include<cstdio>
#include<queue>
#include<vector>
const int inf=23333333;
using namespace std;
struct node {
	int num,len;
};
struct edge{
	int dis,num,flag;
	bool operator < (const edge &a) const
	{
		return a.dis<dis;
	}
};
int n,m,k,a,b,c,dis[100100][51];
vector<node>g[100100];
priority_queue<edge>q;
bool vis[100100][51];
int i,j;
void dj(int s)
{
	int i;
	dis[s][0]=0;
	vis[s][0]=1;
	int nt=0;
	edge tmp;
	tmp.dis=0;
	tmp.num=s;
	tmp.flag=nt;
	q.push(tmp);
	while(q.size())
	{
		int v=q.top().num,f=q.top().flag;
		q.pop();
		vis[v][f]=1;
		if(v==n&&f==k)return;
		for(i=1;i<=g[v].size();i++)
		{
			if(f+1<=k&&dis[v][f]<dis[g[v][i].num][f+1])
			{
				dis[g[v][i].num][f+1]=dis[v][f];
				if(!vis[g[v][i].num][f+1]){
				
				tmp.dis=dis[v][f];
				tmp.flag=f+1;
				tmp.num=g[v][i].num;
				q.push(tmp);}
			}
			if(dis[g[v][i].num][f]>dis[v][f]+g[v][i].len)
			{
				dis[g[v][i].num][f]=dis[v][f]+g[v][i].len;
				if(!vis[g[v][i].num][f]){
				
				tmp.dis=dis[g[v][i].num][f];
				tmp.flag=f;
				tmp.num=g[v][i].num;
				q.push(tmp);
			}
			}
		}
	}
}
int main() {
	scanf("%d%d%d",&n,&m,&k);
	for(i=1; i<=m; i++) {
		scanf("%d%d%d",&a,&b,&c);
		g[a].push_back((node) {
			b,c
		});
		g[b].push_back((node) {
			a,c
		});
	}
	for(i=1;i<=n;i++)
	for(j=0;j<=k;j++)
	dis[i][j]=inf;
	dj(1);
	printf("%d",dis[n][k]);
	return 0;
}

回复

3 条回复,欢迎继续交流。

正在加载回复...