【Wannafly Daily】【XJTUOJ】12 好友推荐

来源:互联网 发布:网络音柱怎么连接 编辑:程序博客网 时间:2024/04/30 12:32

http://oj.xjtuacm.com/problem/12/

题解点这里~~~

#include<stdio.h>#include<cstring>#include<vector>using namespace std;typedef long long ll;#define pb push_back#define N 100005#define M 200005vector<int> G1[N],G2[N],G[N];int sum1[N],sum2[N],sum3[M],n,m,du[N],e[M][2];#define For(i,v) for (int _##i=0,i;_##i<v.size() && (i=v[_##i]);_##i++)inline ll sum_4(){    ll ans1=0,ans2=0;    for (int i=1;i<=n;i++)    {        For(j,G1[i]) For(k,G1[j]) sum1[k]++;        For(j,G2[i]) For(k,G1[j]) sum2[k]++;        For(j,G1[i]) For(k,G1[j])        {            ans1+=(ll)sum1[k]*(sum1[k]-1)/2;            ans1+=(ll)sum1[k]*sum2[k];            sum1[k]=0;        }        For(j,G2[i])For(k,G1[j])        {            if (k!=i) ans2+=(ll)sum2[k]*(sum2[k]-1)/2;            sum2[k]=0;        }    }    return ans1+ans2/2;}inline ll sum_3(){    for (int i=1;i<=m;i++)    {        int u=e[i][0],v=e[i][1];        For(j,G1[u]) sum1[j]=G[u][_j];        For(j,G1[v]) if (sum1[j])        {            sum3[i]++;            sum3[sum1[j]]++;            sum3[G[v][_j]]++;        }        For(j,G1[u]) sum1[j]=0;    }    ll ans=0;    for (int i=1;i<=m;i++) ans+=(ll)sum3[i]*(sum3[i]-1)/2;    return ans;}int main(){    while (~scanf("%d%d",&n,&m))    {        for (int i=1;i<=n;i++) G1[i].clear(),G2[i].clear(),G[i].clear();        memset(du+1,0,n*sizeof(int));        memset(sum3+1,0,m*sizeof(int));        for (int i=1,u,v;i<=m;i++)        {            scanf("%d%d",&u,&v);            e[i][0]=u,e[i][1]=v;            du[u]++,du[v]++;        }        for (int i=1;i<=m;i++)        {            int u=e[i][0],v=e[i][1];            if (du[v]<du[u] || (du[u]==du[v] && v<u)) swap(u,v);            G1[u].pb(v);G2[v].pb(u);            G[u].pb(i);        }        printf("%lld\n",2*sum_4()-sum_3());     }}
0 0
原创粉丝点击