hdu 4635 Strongly connected

来源:互联网 发布:优米网倒闭知乎 编辑:程序博客网 时间:2024/06/05 02:18
#include <stdio.h>#include <string.h>#include <iostream>#include <algorithm>#include <vector>#include <queue>#include <stack>#include <set>#include <map>#include <string>#include <math.h>#include <stdlib.h>#include <time.h>//#include<bits/stdc++.h>using namespace std;typedef long long ll;const int N=100000+5;struct Edge{    int s,t;};vector<Edge>edge;vector<int>g[N],gt[N];int n,m,vis[N],in[N],out[N],ord[N],id[N],cnt,sum[N];void Addedge(int s,int t){    Edge tp;    tp.s=s;tp.t=t;    edge.push_back(tp);    g[s].push_back(edge.size()-1);    gt[t].push_back(edge.size()-1);}void dfsa(int u){    int i,v;    vis[u]=1;    for(i=0;i<g[u].size();i++)    {        v=edge[g[u][i]].t;        if(!vis[v]) dfsa(v);    }    ord[cnt++]=u;}void dfst(int u){    int i,v;    vis[u]=1;    id[u]=cnt;    sum[cnt]++;    for(i=0;i<gt[u].size();i++)    {        v=edge[gt[u][i]].s;        if(!vis[v]) dfst(v);    }}int main(){    int O_O,i,u,v;    scanf("%d",&O_O);    for(int _=1; _<=O_O; _++)    {        scanf("%d%d",&n,&m);        edge.clear();        for(i=0;i<n;i++)        {            g[i].clear();            gt[i].clear();            id[i]=i;        }        for(i=0;i<m;i++)        {            scanf("%d%d",&u,&v);            Addedge(u-1,v-1);        }        cnt=0;        memset(sum,0,sizeof(sum));        memset(vis,0,sizeof(vis));        for(i=0;i<n;i++)        {            if(!vis[i]) dfsa(i);        }        cnt=0;        memset(vis,0,sizeof(vis));        for(i=n-1;i>=0;i--)        {            if(!vis[ord[i]])            {                cnt++;                dfst(ord[i]);            }        }        printf("Case %d: ",_);        if(cnt==1)            {printf("-1\n");continue;}        memset(in,0,sizeof(in));        memset(out,0,sizeof(out));        for(i=0;i<edge.size();i++)        {            u=id[edge[i].s];            v=id[edge[i].t];            if(u!=v)            in[v]++,out[u]++;        }        ll ans=0;        int t=n*n-m-n;        for(i=1; i<=cnt; i++)        {            //printf("%d\n",sum[i]);            if(in[i]==0||out[i]==0)                ans=max(ans,(ll)t-sum[i]*(n-sum[i]));        }        printf("%lld\n",ans);    }    return 0;}
0 0
原创粉丝点击