社区讨论
玄学解法,不知道对不对,
P2865[USACO06NOV] Roadblocks G参与者 5已保存回复 13
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 13 条
- 当前快照
- 1 份
- 快照标识符
- @mi7cgrxb
- 此快照首次捕获于
- 2025/11/20 19:24 4 个月前
- 此快照最后确认于
- 2025/11/20 20:29 4 个月前
我把最短路上的边,挨个*3然后A了,但我不会证明啊;
可能是来回3次=之前的一次???
#include <bits/stdc++.h>
using namespace std;
int pre[5010],pren[5010],vis[5010],ans,n,m,cnt,tot,head[5010],sxdhy[5010];
long long dis[5010],maxx;
struct edge{
int next,to;long long val;
}a[501000];
void add(int x,int y,int z){
a[++cnt].next=head[x];
a[cnt].to=y;
a[cnt].val=z;
head[x]=cnt;
}
queue<int >q;
void spfa(int x){
memset(dis,127,sizeof(dis));
dis[x]=0;
q.push(x);
while(!q.empty()){
int u=q.front();
q.pop();
vis[u]=0;
for(int i=head[u];i;i=a[i].next){
int v=a[i].to;
if(dis[v]>dis[u]+a[i].val){
pre[v]=i;
pren[v]=u;
dis[v]=a[i].val+dis[u];
if(vis[v]==0){
vis[v]=1;
q.push(v);
}
}
}
}
}
int main(){
scanf("%d%d",&n,&m);
while(m--){
int x,y,z;scanf("%d%d%d",&x,&y,&z);
add(x,y,z);
add(y,x,z);
}
memset(pren,-1,sizeof(pren));
spfa(1);
ans=dis[n];
int dhy=n;
while(1){
if(dhy==1)break;
sxdhy[++tot]=pre[dhy];
dhy=pren[dhy];
}
long long ans2=1e7;
for(int i=1;i<=tot;i++){
int num=sxdhy[i];
int also;if(num%2==0)also=num-1;else also=num+1;
a[num].val*=3;
a[also].val*=3;
spfa(1);
if(dis[n]>ans){
ans2=min(ans2,dis[n]);
}
a[num].val/=3;
a[also].val/=3;
}
cout<<ans2;
}
回复
共 13 条回复,欢迎继续交流。
正在加载回复...