Edge Deletion--最短路+bfs

本文探讨了一道算法题,目标是在给定点和边的图中,通过保留最多K条边,使得从起点到达各点的最短路径数量最大化。文章详细介绍了使用最短路径算法和广度优先搜索来解决此问题的步骤,并提供了完整的C++代码实现。

题目链接:https://vjudge.net/problem/CodeForces-1076D

题目大意:给出n个点,m条边,最多能保留K条边。原图上每个点的最短路为di。现在删除了边后,使得到点1的距离仍为di的点数量最多的情况下,输出应该保留的K条边的编号。

分析:既然要使结果最大,那就尽可能多保留边,即k条边。跑一遍最短路,求出1到每个点的最短距离,然后bfs,如果某条边在最短路的路径上,那么输出这条边。注意用long long。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;
#define inf 0x3f3f3f3f
typedef long long ll;
const int N = 3e5 + 5;
int n, m, k, cnt, head[2 * N];
ll dis[N];
bool vis[N];
vector<int> ans;
struct Edge {
    int id, to, nxt;
    ll w;
}edge[2 * N];
struct node {
    int id;
    ll d;
    node(){}
    node(int id_, ll d_) {
        this->id = id_;
        this->d = d_;
    }
    bool operator < (const node &a) const {
        return a.d < d;
    }
};
void init() {
    cnt = 0;
    memset(head, -1, sizeof head);
}
void add(int id, int a, int b, ll w) {
    edge[cnt].id = id;
    edge[cnt].to = b;
    edge[cnt].w = w;
    edge[cnt].nxt = head[a];
    head[a] = cnt++;
}
void dijkstra() {
    memset(dis, inf, sizeof dis);
    dis[1] = 0;
    priority_queue<node> q;
    q.push(node(1, 0));
    node tmp;
    while(!q.empty()) {
        tmp = q.top();
        q.pop();
        if(vis[tmp.id]) continue;
        vis[tmp.id] = 1;
        for(int i = head[tmp.id]; i != -1; i = edge[i].nxt) {
            int j = edge[i].to;
            if(!vis[j] && dis[j] > dis[tmp.id] + edge[i].w) {
                dis[j] = dis[tmp.id] + edge[i].w;
                q.push(node(j, dis[j]));
            }
        }
    }
}
void bfs() {
    memset(vis, 0, sizeof vis);
    vis[1] = 1;
    queue<int> q;
    q.push(1);
    int x;
    while(!q.empty()) {
        x = q.front();
        q.pop();
        for(int i = head[x]; i != -1; i = edge[i].nxt) {
            int j = edge[i].to;
            if(!vis[j] && dis[j] == dis[x] + edge[i].w) {
                vis[j] = 1;
                ans.push_back(edge[i].id);
                q.push(j);
            }
        }
    }
}
void print() {
    int cnt = ans.size();
    cnt = min(cnt, k);
    printf("%d\n", cnt);
    for(int i = 0; i < cnt; i++)
        printf("%d%s", ans[i], i == cnt - 1 ? "\n" : " ");
}
int main() {
    init();
    scanf("%d %d %d", &n, &m, &k);
    int a, b;
    ll w;
    for(int i = 1; i <= m; i++) {
        scanf("%d %d %lld", &a, &b, &w);
        add(i, a, b, w);
        add(i, b, a, w);
    }
    dijkstra();
    bfs();
    print();
    return 0;
}

 

基于可靠性评估序贯蒙特卡洛模拟法的配电网可靠性评估研究(Matlab代码实现)内容概要:本文围绕“基于可靠性评估序贯蒙特卡洛模拟法的配电网可靠性评估研究”,介绍了利用Matlab代码实现配电网可靠性的仿真分析方法。重点采用序贯蒙特卡洛模拟法对配电网进行长时间段的状态抽样与统计,通过模拟系统元件的故障与修复过程,评估配电网的关键可靠性指标,如系统停电频率、停电持续时间、负荷点可靠性等。该方法能够有效处理复杂网络结构与设备时序特性,提升评估精度,适用于含分布式电源、电动汽车等新型负荷接入的现代配电网。文中提供了完整的Matlab实现代码与案例分析,便于复现和扩展应用。; 适合人群:具备电力系统基础知识和Matlab编程能力的高校研究生、科研人员及电力行业技术人员,尤其适合从事配电网规划、运行与可靠性分析相关工作的人员; 使用场景及目标:①掌握序贯蒙特卡洛模拟法在电力系统可靠性评估中的基本原理与实现流程;②学习如何通过Matlab构建配电网仿真模型并进行状态转移模拟;③应用于含新能源接入的复杂配电网可靠性定量评估与优化设计; 阅读建议:建议结合文中提供的Matlab代码逐段调试运行,理解状态抽样、故障判断、修复逻辑及指标统计的具体实现方式,同时可扩展至不同网络结构或加入更多不确定性因素进行深化研究。
### 排查Cinder Volume状态为Error的原因及解决方案 当Cinder Volume的状态变为`error`时,这通常是由于某种异常情况引起的。以下是一些常见的原因及其对应的解决方法。 #### 可能的原因及解决措施 ##### 1. 卷删除失败 如果卷在删除过程中出现问题,可能会导致其状态变为`error_deleting`或终转为`error`。这种情况下,可以尝试手动修改卷的状态并重新删除。 - 修改卷状态为`error`: ```bash [root@controller ~]# cinder reset-state --state error <volume-id> ``` - 删除有问题的卷: ```bash [root@controller ~]# cinder delete <volume-id> ``` - 如果仍然无法删除,可以直接强制删除: ```bash [root@controller ~]# cinder force-delete <volume-id> ``` 这些命令可以帮助清理卡住的卷资源[^1]。 ##### 2. 后端存储连接问题 有时,计算节点与卷之间的链接未能正确释放,可能导致卷进入错误状态。此时需要检查后端存储的日志文件(如LVM日志或其他存储插件的日志),寻找潜在的错误信息。 - 对于LVM后端,验证是否有足够的空间可用,并确保卷组已正确定义: ```bash [root@compute ~]# vgs ``` - 如果发现卷组容量不足,扩展逻辑卷或将数据迁移到其他位置可能是必要的解决方案之一[^3]。 ##### 3. Cinder Driver Bug 或兼容性问题 某些版本可能存在驱动程序缺陷,特别是Red Hat OpenStack Platform中报告过的Bug(例如[Bugzilla ID:888987](https://bugzilla.redhat.com/show_bug.cgi?id=888987))。在这种情形下,升级至新稳定版或者应用补丁将是首要考虑事项。 - 检查现有环境使用的软件包版本号: ```bash [root@controller ~]# rpm -qa | grep openstack-cinder ``` - 根据官方文档指导完成相应组件更新过程[^4]。 ##### 4. 数据库一致性损坏 偶尔也会因为数据库记录不一致而导致此类现象发生。建议备份好原始资料后再执行修复动作。 - 清理残留条目前先停止服务以防冲突; - 利用DB工具扫描表结构差异找出矛盾之处加以修正; --- ### 实现脚本化批量处理 为了简化重复性的维护作业流程,下面提供一段Python脚本来自动检测所有处于非正常状况下的实例并采取预设好的应对策略: ```python from cinderclient import client import os def get_cinder_client(): auth_url = "http://<keystone-host>:5000/v3" username = "<your-admin-user>" password = "<your-password>" tenant_name = "<your-project-name>" sess = session.Session(auth=(auth_url, (username, password)), project_name=tenant_name) return client.Client('3', session=sess) if __name__ == "__main__": cc = get_cinder_client() volumes = cc.volumes.list(search_opts={'all_tenants': True}) for vol in volumes: if vol.status.lower() in ['error', 'error_deleting']: try: print(f"Resetting state of volume {vol.id} from '{vol.status}' to 'available'") cc.volumes.reset_state(vol.id, 'error') choice = input("Do you want to attempt deletion now? y/n ") if choice.strip().lower()[0]=='y': cc.volumes.force_delete(vol.id) except Exception as e: print(e) ``` 注意替换模板内的占位符以适配实际部署场景需求[^3]. --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值