“浪潮杯”山东省第六届ACM大学生程序设计竞赛 Circle of Friends_但求-_-心安的博客-程序员秘密

技术标签: ACM-强联通分量  “浪潮杯”山东省第六届ACM大学生程序设计竞赛  

先用强联通分量缩点,然后深搜找最短路径就行了,
#include <bits/stdc++.h>
using namespace std;
const int max_V=100005;
vector<int>G[max_V];
vector<int>rG[max_V];
vector<int>vs;
int used[max_V];
int cmp[max_V],cnt[max_V],vis[max_V];
int V;
void dfs(int v)
{
    used[v]=1;
    for(int i=0; i<(int)G[v].size(); i++)
    {
        if(!used[G[v][i]])
            dfs(G[v][i]);
    }
    vs.push_back(v);
}
void rdfs(int v,int k)
{
    cnt[k]++;
    used[v]=1;
    cmp[v]=k;
    for(int i=0; i<(int)rG[v].size(); i++)
    {
        if(!used[rG[v][i]])
            rdfs(rG[v][i],k);
    }
}

int Kosaraju()
{
    int k=0;
    memset(used,0,sizeof(used));
    vs.clear();
    for(int v=0; v<V; v++)
    {
        if(!used[v])dfs(v);
    }
    memset(used,0,sizeof(used));
    for(int i=V-1; i>=0; i--)
    {
        if(!used[vs[i]])
        {
            rdfs(vs[i],k++);
        }
    }
    return k;
}
int flag=0;
int dfs1(int u,int now)
{
if(used[u]!=-1)return used[u];
 if(cmp[u]==cmp[V-1])
 {flag=1;return now;}
 int ans=100001;
 for(int i=0;i<(int)G[u].size();i++)
 {
     int tmp=G[u][i];
     if(vis[tmp])continue;
     vis[tmp]=1;
     ans=min(ans,dfs1(G[u][i],now+(cmp[u]==cmp[tmp]?0:1)));
     vis[tmp]=0;
 }
 used[u]=ans;
 return ans;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
    int m,x,y;
    scanf("%d%d",&V,&m);
    for(int i=0;i<V;i++)G[i].clear(),rG[i].clear();
    memset(cnt,0,sizeof(cnt));
    while(m--)
    {
        scanf("%d%d",&x,&y);
        G[x].push_back(y);
        rG[y].push_back(x);
    }
    Kosaraju();
    if(cmp[0]==cmp[V-1])
        {printf("0\n");
    continue;}
    memset(used,-1,sizeof(used));
    memset(vis,0,sizeof(vis));
    vis[0]=1;
    flag=0;
    dfs1(0,0);
    if(flag==0)
    {
        printf("-1\n");
    continue;
    }
     printf("%d\n",used[0]);
}
    return 0;
}

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/clx55555/article/details/80118015

智能推荐

Android Studio 赛博朋克风注册登录app_影流小白的博客-程序员秘密

结果展示:主界面:登录界面:注册界面:一、设计要求:①主界面供用户选择登录/注册 并展示用户昵称、用户ID②登陆界面,点击登录后查询用户输入用户名与密码是否与内设用户名密码一致。一致消息提示登陆成功不一致消息提示登陆失败未填写时以消息提示/对话框方式提醒用户③注册界面,点击注册后跳转至主界面显示用户信息未填写时消息提示二、设计框架:主界面:设置请求码 private static final int REQUEST_REGISTER_CODE = 1; privat

万字好文!14 个 Spring MVC 顶级技巧,随时用随时爽,一直用一直爽_程序员小乐的博客-程序员秘密

点击上方 &#34;后端架构师&#34;关注,星标或置顶一起成长后台回复“大礼包”有惊喜礼包!关注订阅号「后端架构师」,收看更多精彩内容每日英文Miracles sometimes o...

frp构建多级网络代理_frp ip代理_山山而川'的博客-程序员秘密

frp 是一个专注于内网穿透的高性能的反向代理应用,支持 TCP、UDP、HTTP、HTTPS 等多种协议,采用 Golang 编写,支持跨平台,仅需下载对应平台的二进制文件即可执行,没有额外依赖。frp可以将内网服务以安全、便捷的方式通过具有公网 IP 节点的中转暴露到公网。且frp不会被杀软查杀!!frp 有windows和linux两个版本, 主要包含以下文件:frps,服务端程序;frps.ini,服务端配置文件。frpc,客户端程序;frpc.ini,客户端配置文件。

《我就是演员》半决赛观后感_《我就是演员》观后感_starrow的博客-程序员秘密

半决赛我觉得最好的一幕就是梅兰芳,真挚动人,余韵绵长。因为节目本质上是综艺,所用的剧本大多追求表面上的好看和刺激,结果就是几乎每一场都有演员泪流满面。梅兰芳这一幕剧,在人物感情的深沉饱满上绝不逊色于其他剧目,然而因为牵涉到复杂的历史背景,线索是艺术家的心路和抉择,不但主题跳出了普通人生活的窠臼,而且思想之深刻和意境之悠远,我觉得也是众多剧目中难得的。​我没有看过电影原作,但丝毫不觉得这幕戏有多...

opencv-contrib-python3.4.1.15(python3.7)的whl文件下载地址_织茧的博客-程序员秘密

转载地址:contrib下载地址一定要跟自己的opencv的版本一致,不然就能用了

angular中使用ngx-translate国际化配置_faine℃的博客-程序员秘密

一、ngx-translate认识ngx-translate:The internationalization (i18n) library for Angular.二、安装npm install @ngx-translate/core --savenpm install @ngx-translate/http-loader --save三、项目中配置使用ngx-translate...

随便推点

6合1 Type-C扩展坞_v13632775601的博客-程序员秘密

硕盟Type-C扩展坞具有6合1的功能,接口非常的丰富,利用tpye-C接口的强大输送能力,转换为丰富的接口样式,对于使用轻薄本的用户来说,绝对是一大福音。现在很多笔记本电脑接口并不多,只配置一个Type-C是简约了,但是日常使用并不方便,因此很有必要配置一个多功能的接口。硕盟Type-C扩展坞就是你寻找了很久的产品。硕盟Type-C扩展坞拥有3个USB 3.0接口,同时支持网线接入,以及HDMI和PD快充的配置。硕盟Type-C扩展坞可以同时驳接多个设备,同时也可以支持给笔记本充电。并且硕

GitLab-CI介绍和GitLab-Runner安装_ARIC_TXB的博客-程序员秘密

一、什么是GitLab-CICI,Continuous Integration,持续集成,是软件开发过程中一个非常重要的环节,在互联网敏捷开发的过程中,持续集成通常用来进行日常编译和自动化测试,来保证及时发现提交的问题,避免影响项目进度。通常持续集成的过程包括:提交(合并)代码编译测试发布以前软件集成的工作是由人工完成的,但是现在鼓励持续集成,所以,应该考虑将软件集成这个工作自动...

gephi--sigma插件使用&toolkit_gephi计算全局效率的插件包_M . H ~的博客-程序员秘密

gephi官网下载gephi官网下载plugin之后,工具–下载–添加插件把下载的nbm插件添加进去之后导出文件输出的是一个network文件包项目,里面的页面只能在项目里打开下载整个sigma项目练习里面有很多的练习项目同样的需要在项目里打开,尤其是涉及gexf的项目toolkithttps://gephi.org/toolkit/https://gephi.org/gephi-toolkit/0.9.2/apidocs/...

Vuex getter更新不及时问题_vuex getters没有及时更新页面_jeft_hai的博客-程序员秘密

state改变但是getter不改变可以把getter改为一个函数,每次调用都调用一下函数就肯定刷新了hasBaseInfo: state =&gt; () =&gt; !(state.user.nickName === state.user.name || !state.user.gender)...

代码大全—精华摘录(二)_我走的很慢的博客-程序员秘密

文章目录关键的“构建”决策[^1]设计中的挑战[^1]关键的“构建”决策1Sapir-Whorf假说:你思考的能力取决于你是否知道能够表达该思想的词汇。成功编程的一个关键就在于避免随意地变化,这样你的大脑可以专注于那些真正需要的变化。程序员应首先决定他要表达的思想是什么,然后决定如何使用特定语言提供的工具来表达这些思想,而不是将思想限制于”语言直接支持的那些构件“,因为如果语言工具是初级的,那么程序员的思想也是初级的。如果你使用的语言缺乏你希望用的构件,那就应该试着去弥补它。发明你自己的编码约定

为何有人会去搞计算机病毒,为什么会有计算机病毒呢_weixin_39630515的博客-程序员秘密

为什么会有计算机病毒呢?很多朋友发出感叹!下面由小编给你做出详细的计算机病毒说法介绍!希望对你有帮助!计算机病毒说法一:电脑病毒是人编写的一种程序为什么有病毒呢?因为世界之大无奇不有有人喜欢玩计算机也有人喜欢玩病毒不过现在更多的是受利益的驱使计算机病毒说法二:·微软官方网对计算机病毒的介绍: 计算机病毒是蓄意设计的软件程序,目的是干扰计算机操作记录、毁坏或删除数据,或者自行传播到其他计算机和整个 ...

推荐文章

热门文章

相关标签