前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >风险度量

风险度量

作者头像
Max超
发布于 2019-01-21 06:49:22
发布于 2019-01-21 06:49:22
70000
代码可运行
举报
运行总次数:0
代码可运行

题目 X星系的的防卫体系包含 n 个空间站。这 n 个空间站间有 m 条通信链路,构成通信网。 两个空间站间可能直接通信,也可能通过其它空间站中转。

对于两个站点x和y (x != y), 如果能找到一个站点z,使得: 当z被破坏后,x和y无法通信,则称z为关于x,y的关键站点。

显然,对于给定的两个站点,关于它们的关键点的个数越多,通信风险越大。

你的任务是:已知网络结构,求两站点之间的通信风险度,即:它们之间的关键点的个数。

输入数据第一行包含2个整数n(2 <= n <= 1000), m(0 <= m <= 2000),分别代表站点数,链路数。 空间站的编号从1到n。通信链路用其两端的站点编号表示。 接下来m行,每行两个整数 u,v (1 <= u, v <= n; u != v)代表一条链路。 最后1行,两个数u,v,代表被询问通信风险度的两个站点。

输出:一个整数,如果询问的两点不连通则输出-1.

例如: 用户输入: 7 6 1 3 2 3 3 4 3 5 4 5 5 6 1 6 则程序应该输出: 2 初次看到这个题,一下想到邻接矩阵,然后通过深度搜索找寻答案

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include<iostream>
#include<queue>
#define N 1000
using namespace std;
int num[N][N] = {0};
int map[N] = {0}; 
int time[N] = {0};
int x[N] = {0};
int u,v ,n,m,cnt = 0;
//构建矩阵 
void creat(int n,int m)
{
    int u , v;
    for(int i = 0; i < m; i++)
    {
        cin >> u>>v;
        num[u][v] = 1;
        num[v][u] = 1;
    }
    cout<<"所建立的矩阵为:"<<endl;
    for(int i = 1; i <= n; i++)
    {
        for(int j = 1;j <= n; j++)
        {
            cout << num[i][j];
        }
        cout << endl;
    }
    return ;
}
//判断是否走回路 
int check(int n,int step)
{
    for(int i = 0;i <= step; i++)
    {
        if(n==map[i])
        {
            return 0;
        }
    }
    return 1;
}
//矩阵搜索  DFS
void DFS(int index,int step)
{
    if(index==v)
    {
        cnt++;
        for(int i = 0; i < step;i++)
        {
            time[map[i]]++;
        }
        return ;
    }
    for(int i = 1; i <= n; i++)
    {
        if(num[index][i]&&check(i,step))
        {
            map[step] = i;
            DFS(i,step+1);
            map[step] = 0; 
        }
    }
} 
int main()
{
    cin >> n>>m;
    creat(n,m);
    cin >> u >> v;
    map[0] = u;
    DFS(u,1); 
    int x = 0;
    for(int i = 1; i <= n; i++)
    {
        if(time[i]==cnt)//判读在某个站点是否是唯一数
        {
            x++;
        }
    }
    if(cnt==0)
    {
        cout << "-1";
    }
    else if(x==0)
    {
        cout << "0";
    }
    else
    {
        cout << x-2;
    }
    return 0;
}

之后查了一下其他算法,发现使用并查集特别方便。 详细了解并查集请见并查集

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//并查集
#include<iostream>
using namespace std;
int pre[1005];//每个点的前导点
int route[2005][2];
//可以配对的路线
int sum = 0;
//符合条件的 即关键点的数量

//查找
int find(int x)
{
    int r = x;
    while (pre[r] != r)
        r = pre[r];
    int i = x, j;
    while (i != r)//路径压缩算法
    {
        j = pre[i];//在改变他的前导点时,存储他的值
        pre[i] = r;
        i = j;//改变他的前导点为根节点
    }
    return r;
}


void join(int x, int y)
//组合
{
    int fx = find(x), fy = find(y);//分别记录x,y的根节点
    if (fx != fy)//如果他们的根节点相同,则说明他们不是连通图
        pre[fx] = fy;//将x的根结点 同 相连接
}

int main()
{
    int n, m;
    cin >> n>>m;//n表示站点的个数,m表示链路的个数

    for (int i = 0; i < m; i++)
    {
        cin >> route[i][0] >> route[i][1];
        join(route[i][0], route[i][1]);//将数据相互连接
    }


    int q1,q2;//待询问的两个点
    cin >> q1 >> q2;


    for (int ii = 0; ii < n; ii++)pre[ii] = ii;
    for (int j = 0; j < m; j++)
    {

            join(route[j][0], route[j][1]);
    }
    int a = find(q1);
    int b = find(q2);
    //如果边全部存在时不可达,则输出 -1;
    if (a != b)
    {
        cout << "-1" << endl;
    }

    else
    {
        for (int i = 1; i <= n; i++)
//枚举每一个点
        {
            if (i == q1 || i == q2)continue;
//如果是被询问的点,跳过,无需遍历   此处是最关键的部分
            for (int j = 1; j <= n; j++)pre[j] = j;
//将每一个初始化

            for (int j = 0; j < m; j++)
            {
                if (route[j][0] == i || route[j][1]==i)continue;
//去除当前点互相关联的边   解决问题的关键
                int a = find(route[j][0]);
                int b = find(route[j][1]);
                if (a > b) { a ^= b; b ^= a; a ^= b; };//交换
                if (a != b)pre[b] = a;
//以较小的点作为父节点
            }
            int a = find(q1);
            int b = find(q2);
            if (a != b)sum++;;
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017年03月20日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
Spring Session - 使用Spring Session从零到一构建分布式session
https://spring.io/projects/spring-session-data-redis#samples
小小工匠
2021/08/17
3.1K0
【springboot】 spring session 分布式会话共享
前言 如上图,是一个非常传统的服务端拓扑结构,一个web请求,经过负载均衡的转发,到不同的服务器处理。那么来自同一用户的请求将有可能被负载分发到不同的实例中去,如何保证不同实例间Session共享成为一个不得不解决的问题。 Spring Session作为Spring社区官方推荐的一个比较简单快速的Java Web分布式session解决方案,帮我们搞定了长期以来比较蛋疼的session分布式的问题。 搭建spring boot整合spring session 1. 加入Redis和spring-se
冷冷
2018/02/08
1.1K0
【springboot】 spring session 分布式会话共享
分布式session的几种解决方案,你中意哪种?
我发现了一个商城,我还没有登录,就可以往购物车中添加商品,加了好几件后,我准备付款,需要我先去登录,登录完之后付款。
Java旅途
2021/05/10
3450
分布式session的几种解决方案,你中意哪种?
从零开始的Spring Session(二)
上一篇文章 从零开始的Spring Session(一) 中介绍了一些Session和Cookie的基础知识,这篇文章开始正式介绍Spring Session是如何对传统的Session进行改造的。官网这么介绍Spring Session: Spring Session provides an API and implementations for managing a user’s session information. It also provides transparent integration
程序猿DD
2018/02/01
9420
从零开始的Spring Session(二)
艿艿连肝了几个周末,写了一篇贼长的 Spring 响应式 Web 框架 WebFlux!市面第二完整~
摘要: 原创出处 http://www.iocoder.cn/Spring-Boot/WebFlux/ 「芋道源码」欢迎转载,保留摘要,谢谢!
芋道源码
2020/06/01
6.2K0
Spring Session工作原理
HTTP协议本身是无状态的,为了保存会话信息,浏览器Cookie通过SessionID标识会话请求,服务器以SessionID为key来存储会话信息。在单实例应用中,可以考虑应用进程自身存储,随着应用体量的增长,需要横向扩容,多实例session共享问题随之而来。
2020labs小助手
2019/07/30
6470
springboot(14)redis实现session共享
Redis介绍 Redis 是一个高性能的key-value数据库。我们平时在项目中设计数据访问的时候往往都是采用直接访问数据库,采用数据库连接池来实现,但是如果项目访问量过大或者访问过于频繁,将会对
IT架构圈
2018/06/01
3.6K0
Spring Boot(十一)Redis集成从Docker安装到分布式Session共享
Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API,Redis也是技术领域使用最为广泛的存储中间件,它是「Remote Dictionary Service」首字母缩写,也就是「远程字典服务」。
磊哥
2018/12/06
5590
springboot 整合redis实现分布式session
如果session中保存自定义类型数据,类需实现Serializable接口,否则自定义类型序列化失败导致访问报错
路过君
2021/12/07
2480
分布式Session解决方案
Session 是客户端与服务器通讯会话跟踪技术,服务器与客户端保持整个通讯的会话基本信息。
java思维导图
2019/05/21
6240
补习系列(15)-springboot 分布式会话原理
在 补习系列(3)-springboot 几种scope 一文中,笔者介绍过 Session的部分,如下:
美码师
2019/01/23
6500
芋道 Spring Boot Redis 入门
在快速入门 Spring Boot 整合 Redis 之前,我们先来做个简单的了解。在 Spring 的生态中,我们使用 Spring Data Redis 来实现对 Redis 的数据访问。
芋道源码
2020/02/20
1.7K0
芋道 Spring Boot Redis 入门
SpringBoot入门系列(二十八)使用Redis实现分布式Session共享
前面介绍了Spring Boot如何使用Redis缓存。接下来从项目实战出发,介绍使用Redis实现Session共享。
章为忠学架构
2021/07/01
2.7K0
Spring Cloud 2.x系列之springcloud分布式Session之Spring Session
HttpSession是通过Servlet容器创建和管理的,像Tomcat/Jetty都是保存在内存中的。但是把应用搭建成分布式的集群,然后利用F5、LVS或Nginx做负载均衡,那么来自同一用户的Http请求将有可能被分发到多个不同的服务器中。那问题来了,如何保证不同的服务器能够共享同一份session数据呢?最简单的想法,就是把session数据保存到内存以外的一个统一的地方,例如Memcached/Redis等数据库中。那问题又来了,如何替换掉Servlet容器创建和管理的HttpSession的实现呢?
BUG弄潮儿
2022/06/30
6400
Spring Cloud 2.x系列之springcloud分布式Session之Spring Session
Spring Boot 使用 Spring Session 集成 Redis 实现Session共享Spring Boot 使用 Spring Session 集成 Redis 实现Session共享
通常在web开发中,Session 会话管理是很重要的一部分,用于存储与用户相关的一些数据。在Java Web 系统中的 Session一般由 Tomcat 容器来管理。不过,使用特定的容器虽然可以很好地实现会话管理,但是基于Tomcat的会话插件实现tomcat-redis-session-manager 和tomcat-memcache-session-manager,会话统一由 NoSql 管理。对于项目本身来说,无须改动代码,只需要简单的配置Tomcat的server.xml就可以解决问题。但是插件太依赖于容器,并且对于Tomcat各个版本的支持不是特别的好。重写Tomcat的session管理,代码耦合度高,不利于维护。而使用开源的Spring Session 框架,既不需要修改Tomcat配置,又无须重写代码,只需要配置相应的参数即可完成分布式系统中的 Session 共享管理。
一个会写诗的程序员
2018/08/17
3.8K0
重学springboot系列之集群多节点应用session共享,redis分布式锁
项目内引入spring-session-data-redis,配合spring-boot-starter-data-redis
大忽悠爱学习
2021/12/07
1.6K0
重学springboot系列之集群多节点应用session共享,redis分布式锁
Redis | SpringBoot整合Redis
Redis 的常用命令在其他的文章中都已经介绍完了。作为程序员不是要在命令行中使用 Redis,毕竟我们要把 Redis 当做缓存、队列等进行使用时,因此重点还是要在代码中使用。那么,我们就需要去掌握 Redis 相关的 API 的使用方法。
码农UP2U
2020/11/09
1.4K0
芋道 Spring Boot MongoDB 入门
MongoDB 中的许多概念在 MySQL 中具有相近的类比。本表概述了每个系统中的一些常见概念。
芋道源码
2020/04/15
2.8K0
芋道 Spring Boot MongoDB 入门
芋道 Spring Boot Redis 入门(下)
摘要: 原创出处 http://www.iocoder.cn/Spring-Boot/Redis/ 「芋道源码」欢迎转载,保留摘要,谢谢!
芋道源码
2019/11/20
1.8K0
芋道 Spring Boot 缓存 Cache 入门
在系统访问量越来越大之后,往往最先出现瓶颈的往往是数据库。而为了减少数据库的压力,我们可以选择让产品砍掉消耗数据库性能的需求。当然,我们也可以选择如下方式优化:
芋道源码
2020/02/20
3K0
芋道 Spring Boot 缓存 Cache 入门
推荐阅读
相关推荐
Spring Session - 使用Spring Session从零到一构建分布式session
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档