边的删减

Posted 20203246

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了边的删减相关的知识,希望对你有一定的参考价值。

#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>
#include <queue>
using namespace std;
using ll = long long ;
const int M=1e5+10,N=M;
struct node{
    int next,to,val,id;
}e[M<<1];
int head[M<<1],kk;
void add(int from,int to,int val,int id){
    e[++kk]={head[from],to,val,id};
    head[from]=kk;
}
ll dis[N];
struct nod{
    int x,dis;
    bool operator<(const nod&p)const{
        return dis>p.dis;
    }
};
int n,m,k;
void dij(int s){
    memset(dis,0x3f,sizeof dis);
    dis[s]=0;
    priority_queue<nod>q;
    q.push({s,dis[s]});
    while(!q.empty()){
        auto t=q.top();q.pop();
        for(int i=head[t.x];i;i=e[i].next){
            int x=e[i].to,y=e[i].val;
            if(dis[x]>dis[t.x]+y){
                dis[x]=dis[t.x]+y;
                q.push({x,dis[x]});
            }
        }
    }
}
bool vis[N];
vector<int>ans;
void dfs(int s){
    vis[s]=true;
    for(int i=head[s];i;i=e[i].next){
        int x=e[i].to;
        if(!vis[x]&&dis[x]==dis[s]+e[i].val){
            if(ans.size()<k)ans.push_back(e[i].id);
            vis[x]=true;
            dfs(x);
        }
    }
}
int main()
{
    ios::sync_with_stdio(false);
    cin>>n>>m>>k;
    for(int i=1,u,v,val;i<=m;i++){
        cin>>u>>v>>val;
        add(u,v,val,i);
        add(v,u,val,i);
    }
    dij(1);

    dfs(1);
    cout<<ans.size()<<"\\n";
    for(auto &t:ans)
        cout<<t<<" ";
}

  

以上是关于边的删减的主要内容,如果未能解决你的问题,请参考以下文章

视频二次裁剪时间计算出原片的时间片段算法

开源天气时钟项目删减和更新

视频二次裁剪时间计算出原片的时间片段算法

[3.0] 一个人开发一个App,小程序从0到1,删减添加

NLP科普 | 删减扭曲一般化

从线段树的可删减性谈树状数组