hdu 4635——Strongly connected

來源:互聯網
上載者:User

tarjan演算法

最終添加完邊的圖,肯定可以分成兩個部X和Y,其中只有X到Y的邊沒有Y到X的邊,那麼要使得邊數儘可能的多,則X部肯定是一個完全圖,Y部也是,同時X部中每個點到Y部的每個點都有一條邊,假設X部有x個點,Y部有y個點,有x+y=n,同時邊數F=x*y+x*(x-1)+y*(y-1),整理得:F=N*N-N-x*y,當x+y為定值時,二者越接近,x*y越大,所以要使得邊數最多,那麼X部和Y部的點數的個數差距就要越大,所以首先對於給定的有向圖縮點,對於縮點後的每個點,如果它的出度或者入度為0,那麼它才有可能成為X部或者Y部,所以只要求縮點之後的出度或者入度為0的點中,包含節點數最少的那個點,令它為一個部,其它所有點加起來做另一個部,就可以得到最多邊數的圖了

 感覺自己好坑。。。比賽時一直WA,後來才發現犯了忘了初始化的錯誤。。

#include<iostream>#include<cstdio>#include<cstring>using namespace std;#define maxm 210000#define maxn 210000#define LL __int64LL n,m;LL head[maxn],cnt;LL v[maxm],next[maxm];LL dfn[maxn],low[maxn],step;LL sta[maxn],top;LL ID[maxn],IdNum;LL d_in[maxn],d_out[maxn];bool vis[maxn];LL sum[maxn];void add(LL a,LL b){v[cnt]=b;next[cnt]=head[a];head[a]=cnt++;}void Init(){memset(sum,0,sizeof(sum));memset(vis,0,sizeof(vis));memset(d_in,0,sizeof(d_in));memset(d_out,0,sizeof(d_out));memset(head,-1,sizeof(head));memset(dfn,0,sizeof(dfn));memset(low,0,sizeof(low));IdNum=top=step=cnt=0;}void tarjan(LL u){low[u]=dfn[u]=++step;sta[++top]=u;vis[u]=1;for(LL i=head[u];~i;i=next[i]){LL to=v[i];if(!dfn[to]){tarjan(to);low[u]=min(low[u],low[to]);}elseif(vis[to])low[u]=min(low[u],dfn[to]);}if(low[u]==dfn[u]){LL x;IdNum++;do{x=sta[top--];vis[x]=0;sum[IdNum]++;ID[x]=IdNum;}while(u!=x);}}void build(){for(LL i=1;i<=n;i++)for(LL j=head[i];~j;j=next[j]){LL to=v[j];if(ID[i]!=ID[to]){d_in[ID[to]]++;d_out[ID[i]]++;}}}LL max(LL a,LL b){if(a>b)return a;return b;}int main(){LL x,y;LL t;int cnt=0;cin>>t;while(t--){scanf("%I64d%I64d",&n,&m);if(n==1){printf("Case %d: -1\n",++cnt);continue;}Init();for(LL i=1;i<=m;i++){scanf("%I64d%I64d",&x,&y);add(x,y);}for(LL i=1;i<=n;i++)if(!dfn[i])tarjan(i);build();LL ans=0;LL k;for(LL i=1;i<=IdNum;i++)if(d_in[i]==0||d_out[i]==0){k=sum[i];ans=max(ans,k*(k-1)+(n-k)*(n-k-1)+k*(n-k)-m);}if(IdNum!=1)printf("Case %d: %I64d\n",++cnt,ans);elseprintf("Case %d: -1\n",++cnt);}return 0;}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.