社区讨论
求助
CF1076D Edge Deletion参与者 1已保存回复 2
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 2 条
- 当前快照
- 1 份
- 快照标识符
- @lo21eamo
- 此快照首次捕获于
- 2023/10/23 06:25 2 年前
- 此快照最后确认于
- 2023/11/03 06:47 2 年前
模拟赛题,WA2,不知道为什么。
CPP#define int long long//__int128
int n,m,s,u,v,d,i,fl[300001],dis[300001],id[300001],head[300001],vis[300001],cnt;
struct edge{
int to,dis,next;
}e[600001];
void add_edge(int u,int v,int d,int t){
cnt++;
id[cnt]=t;
e[cnt].dis=d;
e[cnt].to=v;
e[cnt].next=head[u];
head[u]=cnt;
}
struct node{
int dis,pos;
bool operator <(const node &x)const{
return x.dis<dis;
}
};
vector<int>ans;
priority_queue<node>q;
void dfs(int x){
fl[x]=1;
for(i=head[x];i;i=e[i].next){
int y=e[i].to;
if(!fl[y]&&dis[y]==dis[x]+e[i].dis){
if(ans.size()<s) ans.push_back(id[i]);
dfs(y);
}
}
}
signed main(){
cin>>n>>m>>s;
for(i=1;i<=n;i++) dis[i]=1e9;
for(i=1;i<=m;i++){
cin>>u>>v>>d;
add_edge(u,v,d,i);
add_edge(v,u,d,i);
}
dis[1]=0;
q.push((node){0,1});
while(!q.empty()){
node tmp=q.top();
q.pop();
int x=tmp.pos,d=tmp.dis;
if(!vis[x]){
vis[x]=1;
for(i=head[x];i;i=e[i].next){
int y=e[i].to;
if(dis[y]>dis[x]+e[i].dis){
dis[y]=dis[x]+e[i].dis;
q.push((node){dis[y],y});
}
}
}
}
dfs(1);
cout<<ans.size()<<endl;
for(auto x:ans) cout<<x<<" ";
}
回复
共 2 条回复,欢迎继续交流。
正在加载回复...