POJ 1182 / Noi 01 食物链 (并查集&代码优化) http://poj.org/problem?id=1182 /*219ms,784KB*/ #include<cstdio> #include<cstring> const int mx = 50005; const int mxadd = 3 * 50000; int fa[mx], rk[mx]; int find(int x) { if (~fa[x]) { int tmp = fa[x]; fa[x] = fi...
关于这道题,这个博客介绍的不错:poj 1182 代码参照这上面写的。 题意: 思路: 见代码。 三层结构如图: 代码: 1#include <iostream>2#include <string.h>3#include <stdio.h>4usingnamespacestd;56/*7这道题使用了并查集,在一个集合的意义代表集合中的节点都能通过根节点确定关系,而不再同一集合内的节点无...
AC代码: #include"iostream"#include"string.h"#include"stack"#include"queue"#include"string"#include"vector"#include"set"#include"map"#include"algorithm"#include"stdio.h"#include"math.h"#definell long long#definebug(x) cout<<x<<" "<<"UUUUU"<<endl;#definemem(a) memset(a,0,sizeof(a)...
AI代码解释 #include<iostream>using namespace std;#defineMAXN50005int n,k;int fa[3*MAXN];int height[3*MAXN];inline intquery(int x){if(fa[x]==x)returnx;else{fa[x]=query(fa[x]);returnfa[x];}}voidunite(int x,int y){x=query(x);y=query(y);if(x==y)return;if(height[x]...
以下代码是这个网页:POJ 1182 食物链【经典并查集应用】中的代码,看了那么多版本,这个最为简洁、清晰,注释也写得很清楚。 #include<cstdio> const int maxn = 50000+10; int p[maxn]; //存父节点 int r[maxn];//存与父节点的关系 0 同一类,1被父节点吃,2吃父节点...
AC代码 #include <iostream> using namespace std; #define MAXN 50005 int n, k; int fa[3 * MAXN]; int height[3 * MAXN]; inline int query(int x) { if (fa[x] == x) return x; else { fa[x] = query(fa[x]); return fa[x]; ...
程序代码: #include<iostream>using namespace std;#define N 200001int f[N],n,k,ans=0;int getf(int v){if(f[v]==v)return v;else{f[v]=getf(f[v]);return f[v];}}void merge(int v,int u){int t1=getf(v);int t2=getf(u);if(t1!=t2)f[t2]=t1;return ;}int main(){int...
代码语言:javascript 代码运行次数:0 运行 AI代码解释 100711011212223233113231155 Sample Output: 代码语言:javascript 代码运行次数:0 运行 AI代码解释 3 分析 带权并查集解法 定义权值数组rela[]描述与根节点的关系,0表示同类,1表示当前点能吃别人,2表示当前点被别人吃。通过向量思想维护root[]和rela[]关系来判断与...
今天我按照这本书的思路写了1182这一题,发现一直超时,把cin改成scanf就AC了,百度了一下发现很多文章讨论它俩性能的差异。得出的结论是,程序设计题尽量用scanf而不是cin。 源代码 #include<iostream>#include<cstdio>usingnamespacestd;classunion_find{private:int*father;int*height;intn;public:union_find(intn...
if ((kind[x]-kind[y]+3)%3==k)//已有关系判断真假 return 0; return 1; } pa[tx]=ty; kind[tx]=(3-kind[x]+kind[y]+k)%3;//状态转移 return 0; } int main() { int N,K,sum=0,D,X,Y; scanf ("%d%d",&N,&K); make_set(N); while (K--) { scanf ("%d%d%d",&D,...