博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
luogu P1726 上白泽慧音
阅读量:4708 次
发布时间:2019-06-10

本文共 2653 字,大约阅读时间需要 8 分钟。

二次联通门 : 

 

 

 

 

/*    luogu P1726 上白泽慧音        Tarjan求强连通分量         输出最大强联通分量是什么      */#include 
#include
#include
#define Max 5020#define INF 1e7void read (int &now){ now = 0; char word = getchar (); while (word > '9' || word < '0') word = getchar (); while (word >= '0' && word <= '9') { now = now * 10 + word - '0'; word = getchar (); }}struct Edge{ int to; int next;}; int Count;int Saber; std :: stack
Stack;struct Road{ int edge[Max]; int Count; };Road road[Max];Edge edge[Max << 6]; int Edge_Count;int edge_list[Max]; inline void AddEdge (int from, int to){ Edge_Count++; edge[Edge_Count].to = to; edge[Edge_Count].next = edge_list[from]; edge_list[from] = Edge_Count;} int father[Max];int low[Max];int ruri[Max];void Dfs (int now){ father[now] = ++Count; low[now] = Count; Stack.push (now); for (int i = edge_list[now]; i; i = edge[i].next) if (!father[edge[i].to]) { Dfs (edge[i].to); low[now] = low[edge[i].to] < low[now] ? low[edge[i].to] : low[now]; } else if (!ruri[edge[i].to]) low[now] = father[edge[i].to] < low[now] ? father[edge[i].to] : low[now]; int x; if (low[now] == father[now]) { Saber++; x = now + 1; while (x != now) { x = Stack.top (); Stack.pop (); ruri[x] = Saber; road[Saber].edge[++road[Saber].Count] = x; } }}int N, M;int main (int argc, char *argv[]){ read (N); read (M); int x, y; int type; int Max_Number = 0; int Min_Edge; for (register int i = 1; i <= M; i++) { read (x); read (y); read (type); AddEdge (x, y); if (type == 2) AddEdge (y, x); } int Answer_Count; for (int i = 1; i <= N; i++) if (!father[i]) Dfs (i); for (int i = 1; i <= Saber; i++) std :: sort (road[i].edge + 1, road[i].edge + 1 + road[i].Count); int pos; for (int i = 1; i <= Saber; i++) { if (road[i].Count > Max_Number) { Max_Number = road[i].Count; Min_Edge = road[i].edge[1]; pos = i; } else if (road[i].edge[1] < Min_Edge && road[i].Count == Max_Number) { Min_Edge = road[i].edge[1]; pos = i; } } printf ("%d\n", road[pos].Count); for (int i = 1; i <= road[pos].Count; i++) printf ("%d ", road[pos].edge[i]); return 0;}

 

转载于:https://www.cnblogs.com/ZlycerQan/p/7045084.html

你可能感兴趣的文章
kivy学习三:打包成window可执行文件
查看>>
兄弟连PHP培训教你提升效率的20个要点
查看>>
【快报】基于K2 BPM的新一代协同办公门户实践交流会
查看>>
关于MySQL的行转列的简单应用
查看>>
Queue 队列的用法
查看>>
CDM常用命令
查看>>
游戏开发中常用的设计模式
查看>>
Linux 中/etc/profile、~/.bash_profile 环境变量配置及执行过程
查看>>
JAVA:图形之利用FontMetrics类居中
查看>>
使用rsync同步目录
查看>>
[读码时间] for循环遍历设置所有DIV块元素背景色为红色
查看>>
网页调用迅雷下载文件
查看>>
Python 调用 Shell命令
查看>>
POJ 1159 Palindrome(最长公共子序列)
查看>>
ubuntu下安装fcitx五笔输入法
查看>>
责任链模式(chain of responsibility)
查看>>
[转载]java多线程学习-java.util.concurrent详解(一) Latch/Barrier
查看>>
ionic - 运行起来
查看>>
Shell 输入/输出重定向
查看>>
数据结构与算法分析(C++)读书笔记
查看>>