HDU 3639 强联通分量

点击打开链接

题意:给一个有向的图,然后找出一个最大的值,这个值是对于一个点来说,能够到达它的点的个数,如果有多个符合按照字典序输出这些点

思路:因为是个有向图且边比较多,如果暴力弄的话无疑会超时,而强联通可以很好的减少多于的边,而强联通后对于一个联通分量来说我们将里面的个数记录下来,然后将图反着建一下(一会说为什么),这样我们现在的图就是一个边较少的图,而每个分量的元素个数就是点权,然后现在是找那个最大的值,它只能出现在图的根部,在根部的话不好统计数量,那么我们就反过来一个DFS就可以了,然后找出最大值即可   PS:之前想法错了所以写的代码很丑

#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;
typedef long long ll;
const int inf=0x3f3f3f3f;
const int maxn=5010;
vector G[maxn];
vector rG[maxn];
vector vs;
bool used[maxn];
int cmp[maxn],V;
void add_edge(int from,int to){
    G[from].push_back(to);
    rG[to].push_back(from);
}
void dfs(int v){
    used[v]=1;
    for(int i=0;i=0;i--){
        if(!used[vs[i]]) rdfs(vs[i],k++);
    }
    return k;
}
vectorfans;
int A[30010],B[30010];
int vis[maxn],dis[maxn],num[maxn],in[maxn],tmp,fvis[maxn];
bool vvv[maxn][maxn];
void DFS(int x){
    tmp+=dis[x];fvis[x]=1;
    for(unsigned int i=0;imax1) max1=dis[i];
        for(int i=0;i

你可能感兴趣的:(图论,强联通分量)