ZOJ 3795 Grouping 求最长链序列露点拓扑
意甲冠军:特定n积分。m向边条。
该点被划分成多个集合随机的每个集合,使得2问题的关键是无法访问(集合只能容纳一个点)
问至少需要被分成几个集合。
假设没有戒指,接着这个话题正在寻求产业链最长的一个有向图。拓扑序运行bfs您可以。
但是有一个环,所以把环缩点成新点x。而点x的点权就是x点在原图中相应的顶点个数。
缩点后就是有向无环图,继续跑一个拓扑序。
- #include <stdio.h>
- #include <string.h>
- #include <iostream>
- #include <algorithm>
- #include <vector>
- #include <queue>
- #include <set>
- #include <map>
- #include <string>
- #include <math.h>
- #include <stdlib.h>
- #include <time.h>
- using namespace std;
- #define N 100010
- //N为最大点数
- #define M 301000
- //M为最大边数
- int n, m;//n m 为点数和边数
- struct Edge{
- int from, to, nex;
- bool sign;//是否为桥
- }edge[M<<1];
- int head[N], edgenum;
- void add(int u, int v){//边的起点和终点
- Edge E={u, v, head[u], false};
- edge[edgenum] = E;
- head[u] = edgenum++;
- }
- int DFN[N], Low[N], Stack[N], top, Time; //Low[u]是点集{u点及以u点为根的子树} 中(全部反向弧)能指向的(离根近期的祖先v) 的DFN[v]值(即v点时间戳)
- int taj;//连通分支标号。从1開始
- int Belong[N];//Belong[i] 表示i点属于的连通分支
- bool Instack[N];
- vector<int> bcc[N]; //标号从1開始
- void tarjan(int u ,int fa){
- DFN[u] = Low[u] = ++ Time ;
- Stack[top ++ ] = u ;
- Instack[u] = 1 ;
- for (int i = head[u] ; ~i ; i = edge[i].nex ){
- int v = edge[i].to ;
- if(DFN[v] == -1)
- {
- tarjan(v , u) ;
- Low[u] = min(Low[u] ,Low[v]) ;
- if(DFN[u] < Low[v])
- {
- edge[i].sign = 1;//为割桥
- }
- }
- else if(Instack[v]) Low[u] = min(Low[u] ,DFN[v]) ;
- }
- if(Low[u] == DFN[u]){
- int now;
- taj ++ ; bcc[taj].clear();
- do{
- now = Stack[-- top] ;
- Instack[now] = 0 ;
- Belong [now] = taj ;
- bcc[taj].push_back(now);
- }while(now != u) ;
- }
- }
- void tarjan_init(int all){
- memset(DFN, -1, sizeof(DFN));
- memset(Instack, 0, sizeof(Instack));
- top = Time = taj = 0;
- for(int i=1;i<=all;i++)if(DFN[i]==-1 )tarjan(i, i); //注意開始点标!。!
- }
- vector<int>G[N];
- int du[N];
- void suodian(){
- for(int i = 1; i <= taj; i++)G[i].clear(), du[i] = 0;
- for(int i = 0; i < edgenum; i++){
- int u = Belong[edge[i].from], v = Belong[edge[i].to];
- if(u!=v)G[u].push_back(v), du[v]++;
- }
- }
- void init(){memset(head, -1, sizeof(head)); edgenum=0;}
- int dis[N];
- int bfs(){
- queue<int>q;
- for(int i = 1; i <= taj; i++)
- if(du[i]==0){q.push(i); dis[i] = bcc[i].size();}
- else dis[i] = 0;
- while(!q.empty()){
- int u = q.front(); q.pop();
- for(int i = 0; i < G[u].size(); i++){
- int v = G[u][i];
- dis[v] = max(dis[u]+(int)bcc[v].size(), dis[v]);
- du[v]--;
- if(du[v]==0)
- q.push(v);
- }
- }
- int ans = 1;
- for(int i = 1; i <= taj; i++)ans = max(ans, dis[i]);
- return ans;
- }
- int main()
- {
- int i,j,u,v;
- while(~scanf("%d %d",&n,&m)){
- init();
- while(m--){
- scanf("%d %d",&u,&v); if(u!=v)
- add(u,v);
- }
- tarjan_init(n);
- suodian();
- printf("%d\n",bfs());
- }
- return 0;
- }
- /*
- 5 5
- 1 2
- 2 3
- 3 4
- 4 1
- 5 1
- 4 4
- 1 2
- 2 3
- 3 4
- 4 1
- 5 3
- 1 2
- 2 3
- 3 4
- */
ZOJ 3795 Grouping 求最长链序列露点拓扑的更多相关文章
- ZOJ 3795 Grouping(scc+最长路)
Grouping Time Limit: 2 Seconds Memory Limit: 65536 KB Suppose there are N people in ZJU, whose ...
- HDU 4612 Warm up tarjan缩环+求最长链
Warm up Problem Description N planets are connected by M bidirectional channels that allow instant ...
- cf374C Inna and Dima dfs判环+求最长链
题目大意是有一个DIMA四种字母组成的矩阵,要在矩阵中找最长的DIMADIMADIMA……串,连接方式为四方向连接,问最长能找到多少DIMA.字母可以重复访问,如果DIMA串成环,即可以取出无限长的D ...
- LG2272/BZOJ1093 「ZJOI2007」最大半连通子图 Tarjan缩点+DAG求最长链
问题描述 LG2272 BZOJ1093 题解 观察半联通的定义,发现图中的一些结点,构成的链一定是一个半联通子图. 此时存在的环可能会干扰求解,于是\(\mathrm{Tarjan}\)缩点. 于是 ...
- zoj 3795 Grouping tarjan缩点 + DGA上的最长路
Time Limit:2000MS Memory Limit:65536KB 64bit IO Format:%lld & %llu Submit Status Practic ...
- ZOJ 3795 Grouping
大致题意是给n个人和m组关系,每组关系都是两个人s和t,表示s年龄不小于t的年龄,然后让你把这n个人分组,使得任何一个组里面的任意两人都不能直接或间接的得出这两个人的年龄大小关系. 思路:根据给出的关 ...
- ZOJ 3795 Grouping 强连通分量-tarjan
一开始我还天真的一遍DFS求出最长链以为就可以了 不过发现存在有向环,即强连通分量SCC,有向环里的每个点都是可比的,都要分别给个集合才行,最后应该把这些强连通分量缩成一个点,最后保证图里是 有向无环 ...
- [LeetCode] Longest Consecutive Sequence 求最长连续序列
Given an unsorted array of integers, find the length of the longest consecutive elements sequence. F ...
- [LeetCode] 128. Longest Consecutive Sequence 求最长连续序列
Given an unsorted array of integers, find the length of the longest consecutive elements sequence. F ...
随机推荐
- linux shell编程指南第十八章------控制流结构
在书写正确脚本前,大概讲一下退出状态.任何命令进行时都将返回一个退出状态.如 果要观察其退出状态,使用最后状态命令: $ echo $? 主要有4种退出状态.前面已经讲到了两种,即最后命令退出状态$ ...
- Lucene.Net 2.3.1开发介绍 —— 三、索引(一)
原文:Lucene.Net 2.3.1开发介绍 -- 三.索引(一) 在说索引之前,先说说索引是什么?为什么要索引?怎么索引? 先想想看,假如现在有一个文本,我们会怎么去搜索.比如,有一个string ...
- opencv如何载入内存中的图像文件
其实很简单,cv::imdecode 支持 std::vector<uchar>的,只要把char* 转 std::vector<uchar>就行了.用 std::vector ...
- Android开发:TextView添加超链接的简便方法
TextView中加入超链接的方式很多,但下面的方式应该的最简便合理的 strings.xml中定义字串 <string name="blog"><a href= ...
- Transparency Tutorial with C# - Part 2
Download Compositing Mode demo project - 24 Kb Download Compositing Mode source - 26 Kb Download Com ...
- CS0433: 类型“BasePage”同一时候存在于“c:\Windows\Microsoft.NETxxxxxxxxxxxxxxxx
网上常见的我就不说了. 假设其他地址的方法解决不了你的问题,那么请往下看. 该类是否存放于 App_Code 下,假设是把该类从App_Code中拉出来,然后再次执行试试.
- 鼠标右键怎么清除Catalyst Control Center
开始→运行→regedit→找到HKEY_CLASSES_ROOT\Directory\Background\shellex\ContextMenuHandlers\ACE→双击并修改其键值 可以删除 ...
- poj2236(并查集)
题目连接 题意:一张图上分布着n台坏了的电脑,并知道它们的坐标.两台修好的电脑如果距离<=d就可以联网,也可以通过其他修好的电脑间接相连.给出操作“O x”表示修好x,给出操作“S x y”,请 ...
- unity3D的FingerGestures小工具
夹 FingerGestures包结构 FingerGestures样例列表 设置场景 教程:识别一个轻敲手势 教程:手势识别器 教程:轻击手势识别器 教程:拖拽手势识别器 教程:滑动手势识别器 教程 ...
- H3C SecPath F100-C 防火墙配置说明
最近的工作需要,将H3C SecPath F100-C天津联通的房间防火墙配置: 网络拓扑例如,下面的: 进入系统管理界面: 默认登陆地址:192.168.0.1 截图由于涉及公司信息就没有上传.大家 ...