[三元环] BZOJ5206: [Jsoi2017]原力

153人阅读 评论(0) 收藏 举报
分类:

活那么久竟然都不会找三元环…

https://www.cnblogs.com/jiachinzhao/p/7474761.html

这题的话,颜色相同且两端点相同的边权值可以加在一起,然后找三元环就好了

#include <cstdio>
#include <iostream>
#include <algorithm>

using namespace std;

const int N=100010,P=1e9+7;

inline char nc(){
  static char buf[100000],*p1=buf,*p2=buf;
  return p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++;
}

inline void read(int &x){
  char c=nc(); x=0;
  for(;c>'9'||c<'0';c=nc());for(;c>='0'&&c<='9';x=x*10+c-'0',c=nc());
}

int n,m,cnt,G[N],a[N],b[N],c[N],cl[N],id[N],d[N],vis[N][3],cst[N][3];
struct edge{
  int t,nx,w,c;
}E[N];

inline bool cmp(const int &x,const int &y){
  if(a[x]!=a[y]) return a[x]<a[y];
  if(b[x]!=b[y]) return b[x]<b[y];
  return cl[x]<cl[y];
}

inline void addedge(int x,int y,int w,int c){
  E[++cnt].t=y; E[cnt].nx=G[x]; E[cnt].w=w; E[cnt].c=c; G[x]=cnt;
}

int main(){
  freopen("1.in","r",stdin);
  freopen("1.out","w",stdout);
  read(n); read(m);
  for(int i=1;i<=m;i++){
    read(a[i]); read(b[i]); read(c[i]); id[i]=i;
    char clr; while((clr=nc())!='R' && clr!='G' && clr!='B');
    cl[i]=(clr=='R'?0:(clr=='G'?1:2));
    if(a[i]>b[i]) swap(a[i],b[i]);
  }
  sort(id+1,id+1+m,cmp); int t=1;
  d[a[id[1]]]++; d[b[id[1]]]++;
  for(int i=2;i<=m;i++){
    if(a[id[i]]==a[id[t]] && b[id[i]]==b[id[t]] && cl[id[i]]==cl[id[t]])
      c[id[t]]=(c[id[t]]+c[id[i]])%P;
    else{
      t++; id[t]=id[i];
      d[a[id[i]]]++; d[b[id[i]]]++;
    }
  }
  m=t;
  for(int i=1;i<=m;i++)
    if(d[a[id[i]]]>d[b[id[i]]]) addedge(b[id[i]],a[id[i]],c[id[i]],cl[id[i]]);
    else addedge(a[id[i]],b[id[i]],c[id[i]],cl[id[i]]);
  int ans=0;
  for(int k=1;k<=m;k++){
    int u=a[id[k]],v=b[id[k]],cc=cl[id[k]],tot=0;
    for(int i=G[u];i;i=E[i].nx)
      if(E[i].c!=cc) vis[E[i].t][E[i].c]=k,cst[E[i].t][E[i].c]=E[i].w;
    for(int i=G[v];i;i=E[i].nx)
      if(E[i].c!=cc && vis[E[i].t][3-cc-E[i].c]==k)
    tot=(tot+1LL*E[i].w*cst[E[i].t][3-cc-E[i].c])%P;
    ans=(ans+1LL*tot*c[id[k]])%P;
  }
  printf("%d\n",ans);
  return 0;
}
查看评论

bzoj 5206: [Jsoi2017]原力

题意 一个原力网络可以看成是一个可能存在重边但没有自环的无向图。每条边有一种属性和一个权值。属性可能是R、G 、B三种当中的一种,代表这条边上原力的类型。权值是一个正整数,代表这条边上的原力强度。...
  • qq_36797743
  • qq_36797743
  • 2018-03-14 21:49:39
  • 77

BZOJ5206 [Jsoi2017]原力

标签:根号分治,三元环 题目 题目传送门 Description 一个原力网络可以看成是一个可能存在重边但没有自环的无向图。每条边有一种属性和一个权值。属性可能是R、G、B三种当中的一...
  • qwerty1125
  • qwerty1125
  • 2018-03-15 22:03:45
  • 80

JSOI2017 Round 1 游记

前言      ~~~~~~江苏,感觉规模比广东小,但是也是很有质量的地方。      ~~~~~~大概是最后一次跑到别人的省选去了。。。       ~~~~~~然后跟省队好像差了 30 分?? ...
  • rzO_KQP_Orz
  • rzO_KQP_Orz
  • 2017-04-10 09:19:00
  • 827

JSOI2017 垫底记 幸好不是自己省选系列...

Day 17:10分闹钟响了,觉得有点困,就又在床上摊了一会儿。到楼下后已经30多了…等早餐的时候,一开始煮面大妈有点断线,差点迟到翻车。本来想买杯咖啡清醒一下,结果常州一中旁边的小卖部居然都没开门…...
  • YxuanwKeith
  • YxuanwKeith
  • 2017-04-08 20:37:24
  • 1297

Topcoder SRM 543 DIV2 1000 EllysThreeRivers & DIV1 500 EllysRivers

Topcoder SRM 543 DIV2 1000 EllysThreeRivers && DIV1 500 EllysRivers
  • Kanosword
  • Kanosword
  • 2016-09-13 17:33:35
  • 297

[竞赛图三元环存在性判断] HDU 4324 Triangle LOVE

给一个竞赛图 判断是否有三元环 首先 如果我们任意一个环 就可以找到一个三元环 证明: 假设有环上三个相邻的点a-> b-> c 如果c->a有边 就已经形成了一个三元环 ...
  • u014609452
  • u014609452
  • 2017-03-04 20:00:35
  • 1082

求无向图中的三元环个数

无向图是个稀疏图,点数n
  • FlushHip
  • FlushHip
  • 2017-04-16 14:36:47
  • 2876

2012 Multi-University Training Contest 3:Triangle LOVE_判断有向图中是否含有仅由三个点组成的环

ains a single integer t (1 For each case, the first line contains one integer N (0 In the next N...
  • duanxian0621
  • duanxian0621
  • 2012-08-13 20:10:04
  • 1621

CF#318-B - Bear and Three Musketeers-暴力寻找三元环

题意是给你n个点m条边 求出一个三元环(与a相连的边包括b,c)、(与b相连的边包括a,c)(与c相连的边包括a,b) n,m都是1-4000 一开始觉得暴力枚举复杂度肯定过不了。 随手打了一...
  • viphong
  • viphong
  • 2015-09-25 09:30:00
  • 573

[bzoj4899][WerKeyTom_FTD的模拟赛]记忆的轮廓

某蒟蒻WerKeyTom_FTD的模拟赛第三题《记忆的轮廓》
  • WerKeyTom_FTD
  • WerKeyTom_FTD
  • 2016-11-03 21:31:02
  • 733
    个人资料
    持之以恒
    等级:
    访问量: 10万+
    积分: 5263
    排名: 6498
    文章分类
    最新评论