
并查集
秋天的风--
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
展开
-
1272判断是否有环
#include//判断是否有环,判断是否是一部分,判断是否有点#include#define N 100000int pre[N+10],dis[N+10];int find(int n) {if(pre[n]==n) return n; return pre[n]=find(pre[n]);}int main() {int min,max,a,b,i原创 2013-10-30 17:15:26 · 597 阅读 · 0 评论 -
hdu 3038带权并查集
#include#include#define N 200100struct node {int x,count;}pre[N];int find(int n) {if(n!=pre[n].x) {int h=pre[n].x;pre[n].x=find(pre[n].x);pre[n].count=pre[n].count+pre[h].count;原创 2013-12-01 18:12:55 · 578 阅读 · 0 评论 -
hdu 2545 并查集 树上战争
#include#include#define N 110000struct node { int father,count;}pre[N];int find(int x) {if(x==pre[x].father) {pre[x].count=0;return x;} int h=pre[x].father; pre原创 2014-03-08 17:01:09 · 544 阅读 · 0 评论 -
nyoj 711 枚举+并查集
#include//从大到小不断枚举边直到找到s-t的路径,判断从s可以到t可以用并查集来判断#include//枚举最大的一条边肯定要找和他的值最接近的边,所以要排序#define N 5100#define inf 0x3fffffffstruct node {int u,v,speed;}map[N];int gcd(int a,int b) {if(b=原创 2014-04-29 15:58:25 · 538 阅读 · 0 评论 -
hdu 1598 暴力+并查集
#include#include#define N 300int pre[N];int find(int u) {if(u!=pre[u]) pre[u]=find(pre[u]);return pre[u];}struct node {int u,v,speed;}ma[1100];int cmp(const void *a,const vo原创 2014-05-04 23:34:51 · 541 阅读 · 0 评论 -
poj 2377 最大生成树
#include#include#define N 1100struct node {int u,v,w;}bian[110000];int pre[N];int cmp(const void *a,const void *b) {return (*(struct node *)b).w-(*(struct node *)a).w;}int find(int原创 2014-05-11 09:42:07 · 575 阅读 · 0 评论 -
hdu 2682
#include#include#include#include#define N 700#define NN 2000010int prime[NN];int a[N];struct node {int x,y,w;}ma[N*N];void ispri() { int i,j; memset(prime,-1,sizeof(prime)原创 2014-05-20 10:07:44 · 672 阅读 · 0 评论 -
nyoj 38 简单并查集的应用&最小生成树
#include#include#define inf 0x3fffffff#define N 600struct node {int x,y,w;}ma[N*N];int cmp(const void *a,const void *b) {return (*(struct node *)a).w-(*(struct node *)b).w;}int pre[N];int原创 2014-05-20 19:55:51 · 513 阅读 · 0 评论 -
poj 1611 简单并查集的应用
#include#define N 31000int pre[N];int find(int x) {if(x!=pre[x]) pre[x]=find(pre[x]);return pre[x];}int main() { int n,m,i,k,s,t; while(scanf("%d%d",&n,&m),n||m){ for(i=0原创 2014-06-27 17:10:07 · 484 阅读 · 0 评论 -
hdu 1829 带权并查集的运用类似于食物链但是更简单些
#include#define N 1100000struct node {int x,y;}f[N],pre[N];int find(int x) {if(x!=pre[x].x) { int h=pre[x].x; pre[x].x=find(h); pre[x].y=(pre[x].y+pre[h].y)%2;}return pre[x].x;}原创 2014-06-29 19:39:07 · 635 阅读 · 0 评论 -
fzu 2087并查集的运用求最小生成树的等效边
//#include#include#define N 110000int pre[N];struct node {int x,y,w;}ma[N];int findd(int x) {if(x!=pre[x]) pre[x]=findd(pre[x]);return pre[x];}int cmp(const void *a,const void*b) {re原创 2014-05-04 09:18:45 · 449 阅读 · 0 评论 -
poj 1679 判断最小生成树是否唯一
/*只需判断等效边和必选边的个数和n-1的关系即可*/#include#include#define N 110struct node { int u,v,w;}f[N*N*2];int cmp(const void *a,const void*b) {return (*(struct node *)a).w-(*(struct node *)b).w;}int pre[原创 2014-08-14 20:31:51 · 732 阅读 · 0 评论 -
HDU 1198
#include#include#define N 550int map[N][N];int f[N][N][5],h[N][5];int pre[N];int find(int n) {if(n!=pre[n])pre[n]=find(pre[n]);return pre[n];}int main() {int n,m,i,j,ans,f1,f2;原创 2013-11-10 17:18:36 · 744 阅读 · 0 评论 -
poj 1733离散化(map)+并查集
http://blog.sina.com.cn/s/blog_803d08c00100y2yy.html#include#include#includeusing namespace std;const int N =10010;struct node {int count,x;}pre[N];int find(int n) {if(n!=pre[n].x)原创 2013-12-01 17:33:35 · 667 阅读 · 0 评论 -
POJ 1988相对偏移
//不容易啊,终于自己a了一道这种类型的题99M 1 2M 2 4M 4 6M 3 5M 3 7M 1 7// ////////只要变成这种形式然后路径压缩就行了//#include#includeusing namespace std;const int N=30010;struct node {原创 2013-11-27 19:16:04 · 580 阅读 · 0 评论 -
poj 1456
#include#include#include#define N 10010#define inf 999999999int pre[N];struct node { int x,deadline;}map[N];int cmp(const void *a,const void *b) { return (*(struct node *)b).x -(*原创 2013-11-27 21:41:36 · 534 阅读 · 0 评论 -
hdu 1232水
#include#define N 1000int pre[N];int find(int n ){return pre[n]=n==pre[n]?n:find(pre[n]);}int main() {int n,m,a,b,i,cnt,f1,f2;while(scanf("%d",&n),n) {scanf("%d",&m);for(i=1;ipre原创 2013-10-30 18:59:08 · 552 阅读 · 0 评论 -
hdu 1325数据弱
#include//判断是否有环,判断是否有点,判断是否是一个父节点#include#define N 1000000int pre[N+10],dis[N+10];int find(int n ) {if(pre[n]!=n)return pre[n]=find(pre[n]);return pre[n];}int main() {int n,m,i,a,原创 2013-10-30 17:16:11 · 602 阅读 · 0 评论 -
hdu 1213
#includeint pre[1100];int find(int n) { if(pre[n]!=n) return pre[n]=find(pre[n]); return pre[n];}int main(){ int i,j,a,b,sum,f1,f2,n,m,t,h; scanf("%d",&t); wh原创 2013-10-30 17:14:38 · 588 阅读 · 0 评论 -
poj1308
#include#include//判断是否有环,判断是否是一个根节点。判断空树的情况#define N 1000000int pre[N+10],dis[N+10],degree[N+10];int find(int n) {return pre[n]=n==pre[n]?n:find(pre[n]);}int main() {int a,b,cnt,flag,f原创 2013-10-30 17:13:57 · 639 阅读 · 0 评论 -
hdu 1856
#include#include#define N 10000000int pre[N+10],h[N+10],dis[N+10];int find(int n ){return pre[n]=n==pre[n]?n:find(pre[n]);}int main() {int sum,cnt,a,b,f1,f2,n,i,max,min;while(scanf(原创 2013-10-30 17:37:00 · 632 阅读 · 0 评论 -
poj 2236
#include#include#include#define N 1100struct node { int x,y;}map[N];int s[N];int pre[N];int find(int n) { if(n!=pre[n]) pre[n]=find(pre[n]); return pre[n];}int main() { int n,m,i,原创 2013-11-18 13:01:30 · 774 阅读 · 0 评论 -
4496反向并查集
#include#define N 10001#define in 100001int a[in],pre[N],u[in],v[in];int find(int n) { if(n==pre[n]) return n; pre[n]=find(pre[n]);return pre[n];}int main() { int n,m,i,j,x,y,k原创 2013-11-04 13:06:03 · 721 阅读 · 0 评论 -
poj 2253
dijkstra借鉴http://blog.youkuaiyun.com/wangjian8006/article/details/7871812#include#include#define N 300#define inf 999999999double map[N][N],dis[N];double max(double a,double b) {return a>b?原创 2013-11-03 22:22:47 · 580 阅读 · 0 评论 -
poj 1182用向量的思考模式
#include#include#define N 50010int father[N],link[N];int find(int x) { if(x!=father[x]) { int h=father[x]; father[x]=find(father[x]); link[x]=(link[x]+link[h])%3; } return fa原创 2013-11-24 18:20:14 · 611 阅读 · 0 评论 -
poj 1703
#include#include#define N 100010int father[N],link[N];int find(int x) { if(x!=father[x]) { int h=father[x]; father[x]=find(father[x]); link[x]=(link[x]+link[h])%2; } return fath原创 2013-11-24 22:27:56 · 529 阅读 · 0 评论 -
poj1984并查集的相对偏移
#include//典型题#include#define N 40010struct node {int x,y,z;}pre[N];struct fff{int a,b,dis;char s[2];}map[N];//储存int find(int x) {if(x!=pre[x].z) {int h=pre[x].z;pre[x].z=fin原创 2013-11-25 16:09:56 · 598 阅读 · 0 评论 -
poj 1986tarjan模板题
#include#includeusing namespace std;const int N=40010;int pre[N];//并查集int visit[N];//是否经过int ancestor[N];//祖先int dis[N];//储存距离int result[N];//储存结果struct tre{ int x,length;};vec原创 2013-11-26 22:58:02 · 470 阅读 · 0 评论 -
hdu 1811拓扑排序+并查集(容器实现)
#include#include#include#includeusing namespace std;const int N=11000;vectorlink[N];//容器来是模拟邻接表int pre[N],a[N],b[N],indegree[N],n,m,sum;char c[N];int find(int x) {//路径压缩if(x!=pre[x原创 2013-12-03 17:06:05 · 589 阅读 · 0 评论