Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
24580 | yuanjiabao | 【BJ】T2 | C++ | 运行出错 | 41 | 14 MS | 4932 KB | 2731 | 2024-01-04 12:51:52 |
#include<iostream> #include<algorithm> #include<vector> #include<bitset> #include<cstring> using namespace std; inline int read(){ int i=getchar(),r=0; while(i<'0'||i>'9')i=getchar(); while(i>='0'&&i<='9')r=(r<<1)+(r<<3)+(i^48),i=getchar(); return r; } const int N=1100; int n,m,head[N],to[N<<2],nex[N<<2],wei[N<<2]; int dsu[N<<1]; int find(int x){return x==dsu[x]?x:dsu[x]=find(dsu[x]);} int dfn[N],low[N]; void tarjan(int nd,int fa){ dfn[nd]=low[nd]=++dfn[0]; for(int i=head[nd];i;i=nex[i])if(i!=fa){ if(!dfn[to[i]]){ tarjan(to[i],i^1); low[nd]=min(low[nd],low[to[i]]); if(low[to[i]]<dfn[nd])dsu[find(i>>1)]=find(fa>>1); } else if(dfn[to[i]]<dfn[nd]){ low[nd]=min(low[nd],dfn[to[i]]); dsu[find(i>>1)]=find(fa>>1); } } } int b[N<<1]; inline int get_rnk(int x){return lower_bound(b+1,b+m+1,x)-b;} vector<int>v[N<<1]; void init(){ cin>>n>>m; for(int i=1;i<=m;i++)dsu[i]=i; for(int i=1;i<=m;i++){ int u=read(),v=read(); to[i<<1]=v; nex[i<<1]=head[u]; head[u]=i<<1; to[i<<1|1]=u; nex[i<<1|1]=head[v]; head[v]=i<<1|1; wei[i<<1]=wei[i<<1|1]=read(); b[i]=wei[i<<1]; } sort(b+1,b+m+1); for(int i=1;i<=m;i++)wei[i<<1]=wei[i<<1|1]=get_rnk(wei[i<<1]); for(int i=1;i<=n;i++)if(!dfn[i])tarjan(i,0); for(int i=1;i<=m;i++)v[find(i)].emplace_back(i); } bitset<N<<1>col[N<<1]; bool vis[N<<1]; int g[N<<1][N<<1]; int stk[N<<1],top; bool tag[N<<1]; bool dfs(int nd,int fa){ vis[nd]=true; stk[++top]=nd; bool flg=tag[nd]; for(int i=1;i<=m;i++)if(i!=fa&&i!=nd&&g[nd][i]){ flg|=g[nd][i]>1; if(!vis[i])flg|=dfs(i,nd); else flg=true; } return flg; } int main(){ // freopen("b.in","r",stdin); // freopen("b.out","w",stdout); init(); for(int i=1;i<=m;i++){ if(v[i].size()>1){ for(int x:v[i]){ if(col[i][wei[x<<1]])tag[i]=true; col[i][wei[x<<1]]=1; } } else if(v[i].size()==1){ col[0][wei[v[i][0]<<1]]=1; } } for(int i=0;i<=m;i++)if(!i||v[i].size()>1){ for(int j=i+1;j<=m;j++)if(v[j].size()>1)g[i][j]=g[j][i]=(col[i]&col[j]).count(); } int ans=0; for(int i=0;i<=m;i++)if(!i||(!vis[i]&&v[i].size()>1)){ top=0; bool flg=dfs(i,0); for(int j=2;j<=top;j++)col[i]|=col[stk[j]],col[stk[j]].reset(),v[stk[j]].clear(); if(!i||flg)ans+=col[i].count(); else ans+=col[i].count()-1; } cout<<ans; return 0; }