思路:先缩点成有向无环图,则必然含有出度为0的点/入度为0的点,因为要使添加的边尽量多,最多最多也就n*(n-1)条减去原来的m条边,这样是一个强连通图,问题转化为最少去掉几条,使图不强连通,原来图中入度的点,若不添加入度,则必然不连通,同理出度为0的也一样,所以,找入度/出度为0的点中, ki(n-ki)最小的,这里KI是缩点后该SCC中的点数量,这个结果就是最小去掉的边数了。
思路清晰,1A。
#include<iostream>
#include<vector>
#include<cstdio>
#include<cstring>
#include<stack>
using namespace std;
int n,m;
const int maxv=100030;
vector<vector<int> >edges(maxv);
int visited[maxv]; int low[maxv]; int dfn[maxv];
int ind[maxv]; int outd[maxv]; int sccnum[maxv];
int scc[maxv];
int num;int times;
stack<int>s;
int instack[maxv];
void tarjan(int u)
{
low[u]=dfn[u]=times++;
instack[u]=1;
s.push(u);
int len=edges[u].size();
for(int i=0;i<len;i++)
{
int v=edges[u][i];