题目大意:每次输入两个顶点,如果与已输入的顶点可以连成一个环则不放入这两个顶点,否则添加这两个顶点。
本题考查图问题中判断是否为环,可用并查集解决,具体见代码。
//simonPR #include <cstdio> #include <cmath> #include <cstring> #include <ctime> #include <iostream> #include <algorithm> #include <set> #include <vector> #include <sstream> #include <queue> #include <typeinfo> #include <fstream> #include <map> #include <stack> using namespace std; const int maxn=100010; int fa[maxn]; int findset(int x){ return fa[x]==x?x:fa[x]=findset(fa[x]); } int main() { int x,y; int result=0; for(int i=0;i<=maxn;i++) fa[i]=i; while(scanf("%d",&x)==1){ result=0; for(int i=0;i<=maxn;i++) fa[i]=i; while(x!=-1){ scanf("%d",&y); int fx=findset(x),fy=findset(y); //找x,y的祖先。 if(fx==fy) result++; //如果祖先相同,则表示它们在一个环里,则不能加入。 else fa[fx]=fy; //祖先不同,则把两个点合并到一个祖先。 scanf("%d",&x); } printf("%d\n",result); } return 0; }
时间: 2024-10-26 05:36:36