题目链接
题意就是一个无向图,其中有些边权值是固定的有些可以设成任意正整数,求出一种方案使得最短路长度为给定的L,n<=1000,m<=1e4
题解:我没先将可修改的边视为断边跑一遍最短路,若长度已经
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int MaxM=10005;
int N,M,L,S,T;
int U[MaxM],V[MaxM],W[MaxM];
int Tot,Head[1005],Next[MaxM<<1],To[MaxM<<1],Weight[MaxM<<1];
LL Dis[1005];
bool Vis[1005];
void Add_Edge(int u,int v,int w){
Next[++Tot]=Head[u];
To[Tot]=v,Weight[Tot]=w;
Head[u]=Tot;
}
void Dijkstra(){
int i,u,v;
priority_queue<pair<LL,int> > q;
memset(Vis,false,sizeof(Vis));
memset(Dis,0x3f,sizeof(Dis));
Dis[S]=0,q.push(make_pair(0,S));
while(q.size()){
u=q.top().second;
q.pop();
if(Vis[u])
continue;
Vis[u]=true;
for(i=Head[u];i;i=Next[i])
if(Dis[v=To[i]]>Dis[u]+Weight[i]){
Dis[v]=Dis[u]+Weight[i];
q.push(make_pair(-Dis[v],v));
}
}
}
int main(){
freopen("715B.in","r",stdin);
freopen("715B.out","w",stdout);
int i;
scanf("%d%d%d%d%d",&N,&M,&L,&S,&T);
for(i=1;i<=M;i++){
scanf("%d%d%d",&U[i],&V[i],&W[i]);
if(W[i]){
Add_Edge(U[i],V[i],W[i]);
Add_Edge(V[i],U[i],W[i]);
}
}
Dijkstra();
if(Dis[T]<L){
puts("NO");
return 0;
}
for(i=1;i<=M;i++)
if(!W[i]){
W[i]=1;
Add_Edge(U[i],V[i],1);
Add_Edge(V[i],U[i],1);
Dijkstra();
if(Dis[T]<L)
Weight[Tot]=Weight[Tot^1]=W[i]=L-Dis[T]+1;
}
Dijkstra();
if(Dis[T]>L){
puts("NO");
return 0;
}
puts("YES");
for(i=1;i<=M;i++)
printf("%d %d %d\n",U[i],V[i],W[i]);
return 0;
}