3 条题解
-
1
鸡汤来喽!
题解🔗传送门 -
1
-
1
小青君是什么东西啊
狮山代码:
#include<bits/stdc++.h> #define int long long #define N 200005 using namespace std; int u[N],v[N],w[N]; int c[N]; vector<int>b[N]; vector<pair<int,int> >a[N]; int wx[N]; bool vis[N]; int n,m,k,s; int p,q; int t[N]; struct node { int x,step; }; void bfs() { queue<node>qq; for(int i=1;i<=k;i++) { qq.push({c[i],0}); wx[c[i]]=-1; vis[c[i]]=1; } while(!qq.empty()) { node tt=qq.front(); qq.pop(); if(tt.step>=s)continue; int x=tt.x; for(int i=0;i<b[x].size();i++) { int y=b[x][i]; if(!vis[y]&&wx[y]==0) { vis[y]=1; wx[y]=1; qq.push({y,tt.step+1}); } } } } void dijkstra(int x) { memset(vis,0,sizeof(vis)); for(int i=0;i<=200000;i++) { t[i]=0x3f3f3f3f3f3f3f3f; } priority_queue<pair<int,int>,vector<pair<int,int> >,greater<pair<int,int> > >qq; qq.push({0LL,x}); t[x]=0LL; while(!qq.empty()) { int t2=qq.top().second; qq.pop(); if(vis[t2])continue; vis[t2]=1; for(int i=0;i<a[t2].size();i++) { int y=a[t2][i].first; int z=a[t2][i].second; if(wx[y]==-1)continue; if(t[y]>t[t2]+z) { t[y]=t[t2]+z; qq.push({t[y],y}); } } } } signed main() { ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); cin>>n>>m>>k>>s; cin>>p>>q; int i; for(i=1;i<=k;i++) { cin>>c[i]; } for(i=1;i<=m;i++) { cin>>u[i]>>v[i]; b[u[i]].push_back(v[i]); b[v[i]].push_back(u[i]); } bfs(); /*for(i=1;i<=n;i++) { for(int j=0;j<b[i].size();j++) { cout<<b[i][j]<<' '; } cout<<endl; }*/ for(i=1;i<=n;i++) { if(wx[i]==-1)continue; for(int j=0;j<b[i].size();j++) { int x=i,y=b[i][j]; if(wx[y]==-1)continue; else if(wx[y]==1) { a[x].push_back({y,q}); } else { a[x].push_back({y,p}); } } } /*for(i=1;i<=n;i++) { for(int j=0;j<a[i].size();j++) { cout<<a[i][j].first<<' '; } cout<<endl; }*/ dijkstra(1); if(wx[n]==1) cout<<t[n]-q; else cout<<t[n]-p; cout<<endl; }怎么这题这么多90,100的啊
- 1
信息
- ID
- 3165
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 9
- 标签
- (无)
- 递交数
- 100
- 已通过
- 7
- 上传者