社区讨论
只有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 条回复,欢迎继续交流。
正在加载回复...