1分钟出解~
Code:
#include <bits/stdc++.h>
#define N 1000005
#define setIO(s) freopen(s".in","r",stdin)
using namespace std;
struct Edge
{
int u,v;
}e[N<<1];
int p[N];
int find(int x)
{
return p[x]==x?x:p[x]=find(p[x]);
}
int main()
{
// setIO("input");
int n,m,k,i,j,cnt=0;
scanf("%d%d%d",&n,&m,&k);
for(i=1;i<=n;++i) p[i]=i;
for(i=1;i<=m;++i)
{
scanf("%d%d",&e[i].u,&e[i].v);
if(e[i].u>e[i].v) swap(e[i].u,e[i].v);
if(e[i].v<=k)
{
int xx=find(e[i].u),yy=find(e[i].v);
if(xx!=yy)
{
p[xx]=yy;
++cnt;
}
}
else if(e[i].u>k)
{
++cnt;
int xx=find(e[i].u),yy=find(e[i].v);
p[xx]=yy;
}
}
for(i=1;i<=m;++i)
{
if(e[i].u<=k&&e[i].v>k)
{
int xx=find(e[i].u),yy=find(e[i].v);
if(xx!=yy) p[xx]=yy,++cnt;
}
}
printf("%d\n",m-cnt);
return 0;
}
本文介绍了一个快速解决图论中特定问题的算法,通过使用并查集数据结构来处理边的连接状态,有效地减少了计算复杂度,实现了一分钟内解决问题的目标。该算法特别适用于处理大量边和节点的情况,通过合理地处理小于、等于和大于k值的边,避免了不必要的计算。
545

被折叠的 条评论
为什么被折叠?



