Rain_cyl
2024-11-14 16:18:57
考虑一种特殊情况,若
加入虚拟源点,向所有充电站连长为
那如果
这样,我们在堆顶取出一个
而如果在某一时刻,已经有
这可以证明是对的:
时间复杂度
#include<bits/stdc++.h>
using namespace std;
const int N=5e4+5,M=2e5+5;
int n,m,C,R,K;
int h[N],e[M],ne[M],w[M],idx;
unordered_map<int,bool> start[N];
struct Node{
int dist,ver,stid;
bool operator< (const Node &t)const{
return dist>t.dist;
}
};
void add(int a,int b,int c){
e[idx]=b,ne[idx]=h[a],w[idx]=c,h[a]=idx++;
}
void dijkstra(){
priority_queue<Node> q;
for(int i=1; i<=C; i++) q.push({0,i,i});
while(q.size()){
auto t=q.top();
q.pop();
int u=t.ver,d=t.dist,s=t.stid;
if(start[u][s]) continue; //如果(u,s)已被更新过,则当前的一定不优
start[u][s]=1;
for(int i=h[u]; ~i; i=ne[i]){
int j=e[i];
if(d+w[i]>R||start[j].size()>=K) continue;
q.push({d+w[i],j,s});
}
}
}
int main(){
memset(h,-1,sizeof h);
scanf("%d%d%d%d%d",&n,&m,&C,&R,&K);
for(int i=1; i<=m; i++){
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
add(a,b,c),add(b,a,c);
}
dijkstra();
vector<int> res;
for(int i=C+1; i<=n; i++)
if(start[i].size()>=K)
res.push_back(i);
printf("%d\n",res.size());
for(int t:res) printf("%d\n",t);
return 0;
}