给你一张有向图,问你将任意一条边变成双向后,所能得到的最大强连通分量的大小。

缩点之后,预处理can(i,j)表示i能到j。

之后枚举每一条边(u,v),再枚举其他所有点t,如果can(u,t) && can(t,v),则t能和u、v共在一个强连通分量,尝试更新答案。

#include<cstdio>
#include<algorithm>
#include<vector>
#include<cstring>
using namespace std;
bool can[1010][1010];
struct Edge{
int id,v;
};
vector<Edge>G[1010],G2[1010];
vector<int>vs,rG[1010];
int n,m,K;
bool used[1010];
void dfs(int U){
used[U]=1;
for(int i=0;i<G[U].size();++i){
if(!used[G[U][i].v]){
dfs(G[U][i].v);
}
}
vs.push_back(U);
}
int cmp[1010];
void rdfs(int U){
used[U]=1;
cmp[U]=K;
for(int i=0;i<rG[U].size();++i){
if(!used[rG[U][i]]){
rdfs(rG[U][i]);
}
}
}
int a[1010],ans;
void dfs3(int rt,int U){
can[rt][U]=1;
for(int i=0;i<G2[U].size();++i){
if(!can[rt][G2[U][i].v]){
dfs3(rt,G2[U][i].v);
}
}
}
int p,anss[20010];
int main(){
freopen("input.txt","r",stdin);
freopen("output.txt","w",stdout);
int x,y;
scanf("%d%d",&n,&m);
for(int i=1;i<=m;++i){
scanf("%d%d",&x,&y);
G[x].push_back((Edge){i,y});
rG[y].push_back(x);
}
for(int i=1;i<=n;++i){
if(!used[i]){
dfs(i);
}
}
memset(used,0,sizeof(used));
for(int i=vs.size()-1;i>=0;--i){
if(!used[vs[i]]){
++K;
rdfs(vs[i]);
}
}
for(int i=1;i<=n;++i){
++a[cmp[i]];
}
for(int i=1;i<=K;++i){
ans=max(ans,a[i]);
}
for(int i=1;i<=m;++i){
anss[i]=i;
}
p=m;
for(int i=1;i<=n;++i){
for(int j=0;j<G[i].size();++j){
if(cmp[i]!=cmp[G[i][j].v]){
G2[cmp[i]].push_back((Edge){G[i][j].id,cmp[G[i][j].v]});
}
}
}
for(int i=1;i<=K;++i){
dfs3(i,i);
}
for(int i=1;i<=K;++i){
for(int j=0;j<G2[i].size();++j){
int tmp=a[i]+a[G2[i][j].v];
for(int l=1;l<=K;++l){
if(l!=i && l!=G2[i][j].v && can[i][l] && can[l][G2[i][j].v]){
tmp+=a[l];
}
}
if(tmp>ans){
p=1;
anss[p]=G2[i][j].id;
ans=tmp;
}
else if(tmp==ans){
anss[++p]=G2[i][j].id;
}
}
}
sort(anss+1,anss+p+1);
printf("%d\n%d\n",ans,p);
for(int i=1;i<p;++i){
printf("%d ",anss[i]);
}
if(p){
printf("%d\n",anss[p]);
}
return 0;
}

【DFS】【枚举】Gym - 101246G - Revolutionary Roads的更多相关文章

  1. Gym 101246G Revolutionary Roads

    http://codeforces.com/gym/101246/problem/G 题意: 给出一个有向图,现在可以把图中的任意一条边改为无向边,问强连通分量最多可以有多少个点,在此情况下输出所有能 ...

  2. POJ1288 Sly Number(高斯消元 dfs枚举)

    由于解集只为{0, 1, 2}故消元后需dfs枚举求解 #include<cstdio> #include<iostream> #include<cstdlib> ...

  3. POJ 2429 GCD & LCM Inverse (Pollard rho整数分解+dfs枚举)

    题意:给出a和b的gcd和lcm,让你求a和b.按升序输出a和b.若有多组满足条件的a和b,那么输出a+b最小的.思路:lcm=a*b/gcd   lcm/gcd=a/gcd*b/gcd 可知a/gc ...

  4. POJ 1270 Following Orders (拓扑排序,dfs枚举)

    题意:每组数据给出两行,第一行给出变量,第二行给出约束关系,每个约束包含两个变量x,y,表示x<y.    要求:当x<y时,x排在y前面.让你输出所有满足该约束的有序集. 思路:用拓扑排 ...

  5. HDU 2489 Minimal Ratio Tree(dfs枚举+最小生成树)

    想到枚举m个点,然后求最小生成树,ratio即为最小生成树的边权/总的点权.但是怎么枚举这m个点,实在不会.网上查了一下大牛们的解法,用dfs枚举,没想到dfs还有这么个作用. 参考链接:http:/ ...

  6. poj 1753 Flip Game(bfs状态压缩 或 dfs枚举)

    Description Flip game squares. One side of each piece is white and the other one is black and each p ...

  7. POJ 1753 Flip Game (DFS + 枚举)

    题目:http://poj.org/problem?id=1753 这个题在開始接触的训练计划的时候做过,当时用的是DFS遍历,其机制就是把每一个棋子翻一遍.然后顺利的过了.所以也就没有深究. 省赛前 ...

  8. HDU1045 Fire Net(DFS枚举||二分图匹配) 2016-07-24 13:23 99人阅读 评论(0) 收藏

    Fire Net Problem Description Suppose that we have a square city with straight streets. A map of a ci ...

  9. poj 2965 The Pilots Brothers&#39; refrigerator(dfs 枚举 +打印路径)

    链接:poj 2965 题意:给定一个4*4矩阵状态,代表门的16个把手.'+'代表关,'-'代表开.当16个把手都为开(即'-')时.门才干打开,问至少要几步门才干打开 改变状态规则:选定16个把手 ...

随机推荐

  1. Little Mathematics Knowledge 数学小常识

    The sum of arithmetic sequence The sum of geometric sequence A special formula : n·n! = (n+1)! - n! ...

  2. 移动端页面使用rem布局

    阿里团队的高清布局方案代码 所谓高清方案就是根据设备屏幕的DPR(设备像素比,又称DPPX,比如dpr=2时,表示1个CSS像素由4个物理像素点组成) 动态设置 html 的font-size, 同时 ...

  3. shell下在while循环中使用ssh命令的问题

    1 现象描述 最近使用ssh批量执行命令(已经做了密钥互信了),脚本读取配置文件中的主机列表(内容为每行一台主机IP地址),然后执行,可是每次只是执行第一台,就退出循环了. 2 排查思路 由于脚本比较 ...

  4. TCP之listen&backlog

    1. listen函数: #include <sys/socket.h> int listen(int sockfd, int backlog); ret-成功返回0 失败返回- list ...

  5. Linux C中内联汇编的语法格式及使用方法(Inline Assembly in Linux C)【转】

    转自:http://www.linuxidc.com/Linux/2013-06/85221p3.htm 阅读Linux内核源码或对代码做性能优化时,经常会有在C语言中嵌入一段汇编代码的需求,这种嵌入 ...

  6. vscode和phpStorm使用xdebug调试设置

    phpStorm http://www.cnblogs.com/cxscode/p/7045944.html http://www.cnblogs.com/cxscode/p/7050781.html ...

  7. C++——初识C++

    1. C关键字 auto int double long char float short signed unsigned struct union enum static switch case d ...

  8. 大小端 Big-Endian 与 Little-Endian

    应该说没做底层开发(硬件或驱动)的人很可能不会彻底理解大小端的概念,大小端不是简单的一句“大端在前”还是“小端在前”能够概括的问题.在cpu, 内存, 操作系统, 编译选项, 文件,网络传输中均有大小 ...

  9. leetcode 之Swap Nodes in Pairs(21)

    不允许通过值来交换,在更新指针时需要小心. ListNode *swapNodes(ListNode* head) { ListNode dummy(-); dummy.next = head; fo ...

  10. 【python】发送邮件

    从网上找了一些用python发邮件的教程,学习一下: 1.发送普通的文本邮件 http://www.cnblogs.com/xiaowuyi/archive/2012/03/17/2404015.ht ...