首页 > 代码库 > LYDSYday1 Tourist Attractions
LYDSYday1 Tourist Attractions
/*假设路径是 a − b − c − d,考虑枚举中间这条边 b − c,计算有多少可行的 a 和 d。设 degx 表示点 x 的度数,那么边 b − c 对答案的贡献为(degb − 1)(degc − 1)− 经过 b − c 这条边的三元环个数。计算三元环的个数只需要枚举除 b; c 之外的另一个点即可。位运算优化*/#include<cstdio>const int N=1510;int cnt[65536],m,n,i,j,d[N];char g[N][N];long long ans;int popcount(unsigned int x){return cnt[x>>16]+cnt[x&65535];}struct BIT{ unsigned int v[47]; void set(int x){v[x>>5]|=1U<<(x&31);} void count(const BIT&b){for(int i=0;i<=m;i++)ans-=popcount(v[i]&b.v[i]);}}f[N];int main(){ freopen("tour.in","r",stdin);freopen("tour.out","w",stdout); for(i=1;i<65536;i++)cnt[i]=cnt[i>>1]+(i&1); scanf("%d",&n);m=(n-1)>>5; for(i=0;i<n;i++){ scanf("%s",g[i]); for(j=0;j<n;j++)if(g[i][j]==‘1‘)f[i].set(j),d[i]++; } for(i=0;i<n;i++)for(j=0;j<i;j++)if(g[i][j]==‘1‘)ans+=(d[i]-1)*(d[j]-1),f[i].count(f[j]); printf("%I64d",ans*2); fclose(stdin);fclose(stdout); return 0;}
LYDSYday1 Tourist Attractions
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。