您的位置:首页 > 其它

Codeforces 154C Double Profiles

2016-07-20 19:01 281 查看
题意:

有n个点,m条边,问有多少个点对满足除它们之外的其他所有的点对这两个点的连接情况是一样的。

思路:

对于每个合要求的点对来说,它们的连接情况是一样的,也就是连接的点是一样的。那么符合要求的点对只有两种情况,1是对称,2是3个点的环。我们只需要给每个点一个特定的值,若两个点相连,那么两边都加上对方的那个值,最后判断一下有几个值一样的,然后加上从里面选2个的方法数。

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef __int64 LL;

const int MAX=1e6+5;
LL ha[MAX],hb[MAX],va[MAX];
int n,m;

void init(){
LL mod=233333;
va[1]=1;
for(int i=2;i<=n;i++){
va[i]=va[i-1]*mod;
}
}

int main(){
scanf("%d%d",&n,&m);
init();
memset(ha,0,sizeof(ha));
memset(hb,0,sizeof(hb));
while(m--){
int u,v;
scanf("%d%d",&u,&v);
ha[u]+=va[v];
ha[v]+=va[u];
}
for(int i=1;i<=n;i++){
hb[i]=ha[i]+va[i];
}
LL ans=0;
sort(ha+1,ha+1+n);
sort(hb+1,hb+1+n);
LL now=ha[1],cnt=1;
for(int i=2;i<=n;i++){
if(now==ha[i]) cnt++;
else{
ans+=(cnt*(cnt-1))/2;
now=ha[i];
cnt=1;
}
}
ans+=(cnt*(cnt-1))/2;
now=hb[1],cnt=1;
for(int i=2;i<=n;i++){
if(now==hb[i]) cnt++;
else{
ans+=(cnt*(cnt-1))/2;
now=hb[i];
cnt=1;
}
}
ans+=(cnt*(cnt-1))/2;
printf("%I64d\n",ans);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: