首先求出SCC,把图缩点成一个DAG。

通过拓扑排序+DP求出:

dp0[x]:从x点出发能到的点的集合。

dp1[x]:能到x的点的集合。

对于一条边x->y,将它改为双向边后,形成的新的SCC的点数为dp0[x]&dp1[y]中1的个数,用bitset维护。

时间复杂度$O(\frac{n^3}{32})$。

#include<cstdio>
#include<bitset>
using namespace std;
const int N=2002,M=N*N;
int n,m,i,j,x,y,v[N],q[M],h,t,d[N],f[N],ans,res[M];
int g[N][N];bool G[N][N],vis[M];
bitset<N>dp0[N],dp1[N];
inline void read(int&a){char c;while(!(((c=getchar())>='0')&&(c<='9')));a=c-'0';while(((c=getchar())>='0')&&(c<='9'))(a*=10)+=c-'0';}
void dfs1(int x){
v[x]=1;
for(int i=1;i<=n;i++)if(g[x][i]&&!v[i])dfs1(i);
q[++t]=x;
}
void dfs2(int x,int y){
v[x]=0,f[x]=y;dp0[y][x]=dp1[y][x]=1;
for(int i=1;i<=n;i++)if(g[i][x]&&v[i])dfs2(i,y);
}
int main(){
read(n),read(m);
for(i=1;i<=m;i++)read(x),read(y),g[x][y]=i;
for(i=1;i<=n;i++)if(!v[i])dfs1(i);
for(i=n;i;i--)if(v[q[i]])dfs2(q[i],q[i]);
for(i=1;i<=n;i++)for(j=1;j<=n;j++)if(g[i][j]&&f[i]!=f[j])if(!G[f[i]][f[j]])G[f[i]][f[j]]=1,d[f[j]]++;
for(i=h=1,t=0;i<=n;i++)if(f[i]==i&&!d[i])q[++t]=i;
while(h<=t)for(x=q[h++],i=1;i<=n;i++)if(G[x][i]){
dp1[i]|=dp1[x];
if(!(--d[i]))q[++t]=i;
}
for(i=t;i;i--)for(x=q[i],j=1;j<=n;j++)if(G[j][x])dp0[j]|=dp0[x];
for(t=0,i=1;i<=n;i++)for(j=1;j<=n;j++)if(g[i][j]){
int now=(dp0[f[i]]&dp1[f[j]]).count();
if(now<2)continue;
if(now>ans)ans=now,q[t=1]=g[i][j];else if(now==ans)q[++t]=g[i][j];
}
printf("%d\n%d\n",ans,t);
for(i=1;i<=t;i++)vis[q[i]]=1;
for(t=0,i=1;i<=m;i++)if(vis[i])res[++t]=i;
if(t)for(printf("%d",res[1]),i=2;i<=t;i++)printf(" %d",res[i]);
return 0;
}

  

BZOJ4304 : 道路改建的更多相关文章

  1. [BZOJ4304]/[JZOJ3486]道路改建

    题目大意: 给你一个有向图,你可以把其中某一条单向边改成双向边,使得图中最大的SCC最大. 问SCC最大能是多少,有哪些方案? 思路: 对原图缩点后就变成了一个DAG. 我们在DAG上DP,记录一下从 ...

  2. PTA 08-图7 公路村村通 (30分)

    现有村落间道路的统计数据表中,列出了有可能建设成标准公路的若干条道路的成本,求使每个村落都有公路连通所需要的最低成本. 输入格式: 输入数据包括城镇数目正整数NN(\le 1000≤1000)和候选道 ...

  3. PAT 7-14 公路村村通

    https://pintia.cn/problem-sets/1111189748004499456/problems/1111189831248850957 现有村落间道路的统计数据表中,列出了有可 ...

  4. PTA 畅通工程之最低成本建设问题(30 分)(最小生成树 krusal)

    畅通工程之最低成本建设问题(30 分) 某地区经过对城镇交通状况的调查,得到现有城镇间快速道路的统计数据,并提出“畅通工程”的目标:使整个地区任何两个城镇间都可以实现快速交通(但不一定有直接的快速道路 ...

  5. pta08-图7 公路村村通 (30分)

    08-图7 公路村村通   (30分) 现有村落间道路的统计数据表中,列出了有可能建设成标准公路的若干条道路的成本,求使每个村落都有公路连通所需要的最低成本. 输入格式: 输入数据包括城镇数目正整数N ...

  6. pat06-图6. 公路村村通(30)

    06-图6. 公路村村通(30) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 现有村落间道路的统计数据表中,列出了有可能建设成标准公路的 ...

  7. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  8. 7-6 公路村村通(30 分) 【prime】

    7-6 公路村村通(30 分) 现有村落间道路的统计数据表中,列出了有可能建设成标准公路的若干条道路的成本,求使每个村落都有公路连通所需要的最低成本. 输入格式: 输入数据包括城镇数目正整数N(≤10 ...

  9. DS博客作业06--图

    1.本周学习总结 1.1.思维导图 1.2.谈谈你对图结构的认识及学习体会 本章学习了图结构的相关知识,图形结构属于复杂的非线性数据结构,在实际应用中很多问题可以用图来描述.在图结构中,每个元素可以有 ...

随机推荐

  1. Linux下更好用的帮助命令—cheat

    导读 Linux系统中,我们经常会用man命令来帮助查看这个命令的具体用法,man是很强大的,但是英语不好的同学用man用起来可能不那么顺手,自然而然的就出现了cheat命令,cheat命令就是通过简 ...

  2. 关于mac安装rails报错clang: error: unknown argument

    文章都是从我的个人博客上转载过来的,大家可以点击我的个人博客. www.iwangzheng.com mac上安装rails的时候报错, 安装rails的在终端执行了一句命令: $sudo gem i ...

  3. Pascal’s Triangle

    vector<vector<int>> generate(int num) { vector<vector<int>> result; vector&l ...

  4. Python Template 错误

    ImportError: Settings cannot be imported, because environment variable DJANGO_SETTINGS_MODULE is und ...

  5. 61. 从1到n,共有n个数字,每个数字只出现一次。从中随机拿走一个数字x,请给出最快的方法,找到这个数字。如果随机拿走k(k>=2)个数字呢?[find k missing numbers from 1 to n]

    [本文链接] http://www.cnblogs.com/hellogiser/p/find-k-missing-numbers-from-1-to-n.html  [题目] 从1到n,共有n个数字 ...

  6. Java for LeetCode 035 Search Insert Position

    Given a sorted array and a target value, return the index if the target is found. If not, return the ...

  7. HDU 4315 Climbing the Hill (阶梯博弈转尼姆博弈)

    Climbing the Hill Time Limit: 1000MS   Memory Limit: 32768KB   64bit IO Format: %I64d & %I64u Su ...

  8. Ubuntu12.04安装ia32-libs

    sudo apt-get install libc6:i386 sudo -i cd /etc/apt/sources.list.d// care for old-releases.ubuntu.co ...

  9. ubuntu下简单的驱动编译

    转自:http://www.eefocus.com/jefby1990/blog/13-02/291628_c39b8.html 本文是参考了网上多篇帖子而写的算不上什么原创.唯一值得欣慰的只不过在本 ...

  10. Java Hour8

    有句名言,叫做10000小时成为某一个领域的专家.姑且不辩论这句话是否正确,让我们到达10000小时的时候再回头来看吧. 本文作者Java 现经验约为7 Hour,请各位不吝赐教. Hour8 Jav ...