最大的情况是两个点集X,Y,其中X和Y都是完全图,并且X每个点都和Y的每个点相连或者反过来。
而我们就是要去找到这两个点集,首先强连通缩点得到新图。对于缩点后的图,如果某个节点既有出度又有入度则肯定不能作为X或Y集合,如果作为了就不能实现XY只有一个方向连接。
所以找到只有出度或者只有入度的节点,让它为一个集合,剩下点为另一个集合,这样就是最大的了。
#include<iostream> #include<cmath> #include<cstdio> #include<sstream> #include<cstdlib> #include<string> #include<string.h> #include<cstring> #include<vector> #include<algorithm> #include<iterator> #include<queue> #include<ctime> #include<bitset> #define eps 1e-6 #define INF 0x3f3f3f3f #define PI acos(-1.0) #define ll long long #define lson l,m,(rt<<1) using namespace std; #define MAXN 100010 #define MAXM 200005 struct node { int to,next; }edge[MAXM]; int head[MAXN],en; int low[MAXN],dfn[MAXN],stack[MAXN],top,set[MAXN],col,num; bool vis[MAXN],instack[MAXN]; int NUM[MAXN]; int out[MAXN]; int in[MAXN]; int n; int m; void addedge(int a,int b) { edge[en].to=b; edge[en].next=head[a]; head[a]=en++; } void tarjan(int u) { vis[u]=1; dfn[u]=low[u]=++num; instack[u]=true; stack[++top]=u; for(int i=head[u];i!=-1;i=edge[i].next) { int v=edge[i].to; if(!vis[v]) { tarjan(v); low[u]=min(low[u],low[v]); } else if(instack[v]) low[u]=min(dfn[v],low[u]); } if(dfn[u]==low[u]) { int j; col++; do { j=stack[top--]; instack[j]=false; set[j]=col; NUM[col]++; } while (j!=u); } } void init() { int i; top=col=num=0; memset(head,-1,sizeof(head)); memset(instack,0,sizeof(instack)); memset(vis,0,sizeof(vis)); memset(set,-1,sizeof(set)); memset(NUM,0,sizeof(NUM)); memset(in,0,sizeof(in)); memset(out,0,sizeof(out)); } int main() { int a,b,ca=1; int cas; cin>>cas; while(cas--) { scanf("%d%d",&n,&m); init(); for(int i=1;i<=m;i++) { scanf("%d%d",&a,&b); addedge(a,b); } for(int i=1;i<=n;i++) if(!vis[i])tarjan(i); printf("Case %d: ",ca++); if(col==1) { printf("-1\n"); continue; } for(int i=1;i<=n;i++) { for(int j=head[i];j!=-1;j=edge[j].next) { if(set[i]!=set[edge[j].to]) { out[set[i]]++; in[set[edge[j].to]]++; } } } int t=0x7fffffff; for(int i=1;i<=col;i++) { if(!out[i]||!in[i]) { t=min(NUM[i],t); } } ll s=(ll)n*(n-1)-m-(ll)t*(n-t); cout<<s<<endl; } return 0; }
原文:http://blog.csdn.net/t1019256391/article/details/20079649