对应洛谷原题未找到,自己新建了一个,这个(调整不易,您的提交与关注就是博主最大的支持)。
图论建模极佳练习题,建议图论建模初学者尝试。
由于没有时间生成样例,导致很水,请不要骗分
AC代码(不建议CV,提升是最重要的):
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define MP(x,y) make_pair((x),(y))
const int M=5055*2;
int n,m1,m2,dis[105][55],l,sum,u,v,w,cnt,first[105];
bool vis[105][55];
struct T{
int to,w,next,flag;
}edge[M];
inline void add(int u,int v,int w,int flag){
cnt++;
edge[cnt].to=v;
edge[cnt].w=w;
edge[cnt].flag=flag;
edge[cnt].next=first[u];
first[u]=cnt;
}
inline void spfa(int st){
queue<pair<int,int> > pq;
memset(dis,0x3f,sizeof dis);
dis[st][0]=0;
vis[st][0]=1;
pq.push(MP(st,0));
while(!pq.empty()){
int u=pq.front().first;
int dd=pq.front().second;
pq.pop();
vis[u][dd]=0;
for(int i=first[u];i!=0;i=edge[i].next){
int v=edge[i].to,w=edge[i].w,flag=edge[i].flag,newdd=dd;
if(flag){
newdd=dd+1;
}
if(newdd>l){
continue;
}
if(newdd<=m1&&dis[u][dd]+w<dis[v][newdd]){
dis[v][newdd]=dis[u][dd]+w;
if(!vis[v][newdd]){
vis[v][newdd]=1;
pq.push(MP(v,newdd));
}
}
}
}
}
signed main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>n>>m1>>m2>>l;
for(int i=1;i<=m1;i++){
cin>>u>>v;
add(u,v,1,1);
add(v,u,1,1);
}
for(int i=1;i<=m2;i++){
cin>>u>>v>>w;
add(u,v,w,0);
add(v,u,w,0);
}
spfa(1);
int ans=INT_MAX;
for(int i=0;i<=min(l,m1);i++){
if(dis[n][i]<=l){
ans=min(ans,dis[n][i]-i);
}
}
if(ans==INT_MAX)cout<<"-1";
else cout<<ans;
return 0;
}