コード例 #1
0
ファイル: makesetfn.c プロジェクト: sourabhgupta90/codes
main()
{
      
      int choice,list_ele;
      choice=0;
      while(choice!=4)
      {
                  printf("choices\n");
                  printf("for makeset 1 \n");
                  printf("for represtative 2 \n");
                  
                  scanf("%d",&choice);
                  if(choice==1)
                  {
                            printf("enter the data \n");
                            scanf("%d",&list_ele); 
                            head=makeset(&head,list_ele);
                            printf("%d\n",&head);
                            
                  }
                  else if(choice==2)
                  {
                            
                            printf("enter first linked list\n");
                            scanf("%d",&re);
                            k=return1(&head1,re);
                            t=represen(&k);
                            printf("%d\n",t);
                  }
     }
}
コード例 #2
0
	void kruskalalgorithm()
	{
		struct edges e;
		int r1,r2,u;		
		//heap->heapsort();
		int edgesadded = 0;
		for(int i=0;i<NO_OF_VERTICES;i++)
			makeset(i);
		
		while(edgesize > 0 && edgesadded < NO_OF_VERTICES-1)
		{
			e = heap->extractmax();			
			r1 = find(e.u);
			r2 = find(e.v);
			//cout<<" u value is "<<e.u<<" v is "<<e.v<<" wt is "<<e.edgeweight<<" r1 is "<<r1<<" r2 is "<<r2<<endl;
			if(r1 != r2 && edgesadded < NO_OF_VERTICES-1)
			{
				edgesadded++;
				//cout<<" u is "<<e.u<<" v is "<<e.v<<" wt is "<<e.edgeweight<<" r1 is "<<r1<<" r2 is "<<r2<<endl;
				maxspanningtree[(e.u)*NO_OF_VERTICES+(e.v)] = e.edgeweight;
				maxspanningtree[(e.v)*NO_OF_VERTICES+(e.u)] = e.edgeweight;
				merge(r1,r2);
			}
			
		} 
	}
コード例 #3
0
/*
Given an angularly ordered tree (vertices), construct a set of contours where
each contour describe a branch of the tree.
*/
vector<ContourEQW> 
extractPathTree(vector<Vertex<FragmentInfo>*>& vertices, 
				vector<ContourEQW>& contours)
{
	vector<ContourEQW> tree;
	vector<Node<Vertex<FragmentInfo>*>*> vnodes;
	for(int i=0; i<vertices.size(); ++i)
	{
		vnodes.push_back(makeset(vertices[i]));
	}

	vector<Vertex<FragmentInfo>*> ends = findEndPoints(vertices);
	for(int i=0; i<ends.size(); ++i)
	{
		Vertex<FragmentInfo>* p = ends[i];
		vector<Vertex<FragmentInfo>*> path;
		while(true)
		{
			path.push_back(p);
			if(p->pi == NULL)
			{
				break;
			}
			int k = distance(vertices.begin(), find(vertices.begin(), vertices.end(), p->pi));
			if(k < vnodes.size() && vnodes[k]->parent == vnodes[k])
			{
				merge(vnodes[i], vnodes[k]);
				p = p->pi;
			}
			else
			{
				path.push_back(p->pi);
				break;
			}
		}
		tree.push_back(stitchContour(path, contours));
	}

	for(int i=0; i<vnodes.size(); ++i)
	{
		delete vnodes[i];
		vnodes[i] = 0;
	}
	return tree;
}
コード例 #4
0
ファイル: PT07Y.c プロジェクト: sarkysaurabh/SPOJ
int main()
{
		int n,m;
		int a,b;
		int i;
		scanf("%d %d",&n,&m);
		for(i=0;i<n;++i)
		{
				makeset(i);
		}
		int flag = 0;
		for(i=0;i<m;++i)
		{
				scanf("%d %d",&a,&b);
				flag = union_set(a,b);
				if(flag == -1) break;
		}
		if(flag == -1) printf("NO\n");
		else printf("YES\n");
		
}
コード例 #5
0
vector<int>
labelIntraFramePoints(vector<MotionPoint*>& points)
{
	vector<Node<int>*> vnodes;
	for (int i = 0; i < points.size(); ++i)
	{
		vnodes.push_back(makeset(i));
	}
	for (int i = 0; i < points.size(); ++i)
	{
		for (int j = i + 1; j < points.size(); ++j)
		{
			//if (i == j) continue;
			for (int m = 0; m < points[i]->candidates.size(); ++m)
			{
				for (int n = 0; n<points[j]->candidates.size(); ++n)
				{
					//if (points[i].GetLink(j, m, n) > .5) {
					if (points[i]->getLink(m, j, n) > 0.5) //probLink[j][m][n] > .5)
					{
						merge(vnodes[i], vnodes[j]);
					}
				}
			}
		}
	}
	vector<Node<int>*> labels = clusters(vnodes);
	vector<int> ilabels(points.size());
	for (int i = 0; i < points.size(); ++i)
	{
		ilabels[i] = distance(labels.begin(), find(labels.begin(), labels.end(), findset(vnodes[i])));
	}
	for (int i = 0; i < points.size(); ++i)
	{
		delete vnodes[i];
	}
	return ilabels;
}
コード例 #6
0
ファイル: ZOJ_3544.c プロジェクト: allenwhale/acm-icpc
int main()
{
    int i;
    while (scanf("%d%d%d",&n,&m,&q)!=EOF)
    {
        memset(count,0,sizeof(count));
        makeset(n,m);
        for (i=1;i<=q;i++)
        {
            char name[10];
            scanf("%s%d%d",name,&opt[i].x,&opt[i].y);
            opt[i].s=name[0];
            switch (opt[i].s)
            {
                case 'C':scanf("%d%d",&opt[i].l,&opt[i].c); break;
                case 'D':scanf("%d%d",&opt[i].l,&opt[i].c); break;
                case 'R':scanf("%d%d%d",&opt[i].l,&opt[i].w,&opt[i].c); break;
                case 'T':scanf("%d%d",&opt[i].w,&opt[i].c); break;
            }
        }
        for (i=q;i>0;i--)
        {
            switch (opt[i].s)
            {
                case 'C':Cir(opt[i].x,opt[i].y,opt[i].l,opt[i].c); break;
                case 'D':Dia(opt[i].x,opt[i].y,opt[i].l,opt[i].c); break;
                case 'R':Rec(opt[i].x,opt[i].y,opt[i].l,opt[i].w,opt[i].c); break;
                case 'T':Tri(opt[i].x,opt[i].y,opt[i].w,opt[i].c); break;
            }
        }
        for (i=1;i<=9;i++)
            if (i==9) printf("%d\n",count[i]);
            else printf("%d ",count[i]);
    }
    return 0;
}
コード例 #7
0
ファイル: main.c プロジェクト: muller95/NestAPI
int main(int argc, char **argv)
{
	int maxprims, maxfigs, maxpts, state, maxindivs, namelen;
	int nfigs, nprims, npts, setsize, iters;
	int ext;
	struct Individ *indivs, tmp;
	struct Figure *figs, *figset;
	char *str;
	ssize_t chread;
	size_t n;
	int i, j, k, m, nindivs;
	struct NestAttrs attrs;
	
	str = NULL;
	n = 0;

	maxfigs = 128;
	namelen = 2048;
	state = STATE_NEWFIG;
	nfigs = nprims = npts = 0;
	figs = (struct Figure*)xmalloc(sizeof(struct Figure) * maxfigs);

	while ((chread = getline(&str, &n, stdin)) != -1) {
		double x, y;
		trim(str);

		if (state == STATE_NEWFIG) {
			figs[nfigs].name = (char*)xmalloc(sizeof(char) * namelen);
			sscanf(str, "%s %d %d\n", figs[nfigs].name, &figs[nfigs].quant, &figs[nfigs].angstep);
			state = STATE_PRIM;
			
			maxpts = 2048;
			maxprims = 128;

			figs[nfigs].prims = (struct Primitive*)xmalloc(sizeof(struct Primitive) * maxprims); 
			figs[nfigs].prims[nprims].pts = (struct Point*)xmalloc(sizeof(struct Point) * maxpts);

	//		free(str);
			str = NULL;
			continue;
		}
		
		if (strcmp(str, FIG_SEPAR) == 0) {
			state = STATE_NEWFIG;
			figs[nfigs].prims[nprims].npts = npts;
			nprims++;
			figs[nfigs].id = nfigs;
			figs[nfigs].nprims = nprims;
			nfigs++;
			
			if (nfigs == maxfigs) {
				maxfigs *= 2;
				figs = (struct Figure*)xrealloc(figs, sizeof(struct Figure) * maxfigs);
			}
			
			nprims = 0;
			npts = 0;

	//		free(str);
			str = NULL;
			continue;
		}

		if (strcmp(str, PRIM_SEPAR) == 0) {
			figs[nfigs].prims[nprims].npts = npts;
			nprims++;
			if (nprims == maxprims) {
				maxprims *= 2;
				figs[nfigs].prims = (struct Primitive*)xrealloc(figs[nfigs].prims, sizeof(struct Primitive) * maxprims);
			}

			maxpts = 2048;
			figs[nfigs].prims[nprims].pts = (struct Point*)xmalloc(sizeof(struct Point) * maxpts);
			npts = 0;

	//		free(str);
			str = NULL;
			continue;
		}
		
		sscanf(str, "%lf %lf\n", &x, &y);
		
		figs[nfigs].prims[nprims].pts[npts].x = x;
		figs[nfigs].prims[nprims].pts[npts].y = y;
		npts++;

		if (npts == maxpts) {
			maxprims *= 2;
			figs[nfigs].prims[nprims].pts = (struct Point*)xrealloc(figs[nfigs].prims[nprims].pts, sizeof(struct Point) * maxpts);
		}

	//	free(str);
		str = NULL;
	}

	for (i = 0; i < nfigs; i++) {
		figinit(&figs[i]);
	}


	attrs.width = atof(argv[1]);
	attrs.height = atof(argv[2]);
	attrs.type = ROTNEST_DEFAULT;
	attrs.logfile = fopen("./logfile", "w+");

		
	figset = makeset(figs, nfigs, &setsize);
	qsort(figset, setsize, sizeof(struct Figure), figcmp);

	maxindivs = 1024;
	indivs = (struct Individ*)xmalloc(sizeof(struct Individ) * maxindivs);
	indivs[0].genom = (int*)xmalloc(sizeof(int) * setsize);
	indivs[0].gensize = 0;

	rotnest(figset, setsize, &indivs[0], &attrs);
			
	nindivs = 1;	
	ext = 0;
	iters = atoi(argv[3]);
	for (i = 0; i < iters && !ext; i++) {
		int nnew = 0, equal = 0, oldn;
		
		printf("nindivs=%d\n", nindivs);
		for (j = 0; j < 1; j++) {
			printf("ind=%d height=%lf gensize=%d genom: ", i, indivs[j].height, indivs[j].gensize);
			for (k = 0; k < indivs[j].gensize; k++) { 
				printf("%d ", indivs[j].genom[k]);
			}
			printf("\n");
		}

		printf("\n");

		oldn = nindivs;
		for (j = 0; j < oldn - 1 && nnew < 30; j++) {
			struct Individ heirs[2];
			if (indivs[j].gensize == indivs[j + 1].gensize) {
				int res;
				res = crossover(&indivs[j], &indivs[j + 1], &heirs[0], setsize);
				crossover(&indivs[j + 1], &indivs[j], &heirs[1], setsize);
	
				if (res < 0) {
					break;
				}
			}
			else {
				break;
			}

			for (k = 0; k < 2; k++) {
				for (m = 0; m < nindivs; m++) {
					equal = gensequal(&heirs[k], &indivs[m]) || gensequal2(&heirs[k], &indivs[m], figset);
					if (equal) {
						break;
					}
				}
			

				if (!equal) {
					nnew++;
					rotnest(figset, setsize, &heirs[k], &attrs);
					indivs[nindivs] = heirs[k];
					nindivs++;

					if (nindivs == maxindivs) {
						maxindivs *= 2;
						indivs = (struct Individ*)xrealloc(indivs, sizeof(struct Individ) * maxindivs);
					}
				} else {
					destrindiv(&heirs[k]);
				}
			}
		}
		
	
		
		equal = 0;
		while (nnew == 0) {
			int res;
			res = mutate(&indivs[0], &tmp, setsize);
			if (res < 0) {
				ext = 1;
				break;
			}
			equal = 0;
			for (j = 0; j < nindivs; j++) {
				equal = gensequal(&tmp, &indivs[j]) || gensequal2(&tmp, &indivs[j], figset);
				if (equal) {
					break;
				}
			}
			if (!equal) {
				nnew++;
				rotnest(figset, setsize, &tmp, &attrs);
				indivs[nindivs] = tmp;
				nindivs++;

				if (nindivs == maxindivs) {
					maxindivs *= 2;
					indivs = (struct Individ*)xrealloc(indivs, sizeof(struct Individ) * maxindivs);
				}
			} else {
				destrindiv(&tmp);
			}
		}
		qsort(indivs, nindivs, sizeof(struct Individ), gencmp);
	}
	


	for (i = 0; i < indivs[0].npos; i++) {
		double a, b, c, d, e, f;
		a = indivs[0].posits[i].fig.mtx[0][0];
		b = indivs[0].posits[i].fig.mtx[1][0];
		c = indivs[0].posits[i].fig.mtx[0][1];
		d = indivs[0].posits[i].fig.mtx[1][1];
		e = indivs[0].posits[i].fig.mtx[0][2];
		f = indivs[0].posits[i].fig.mtx[1][2];

		printf("%s\n", indivs[0].posits[i].fig.name);
		printf("matrix(%lf, %lf, %lf, %lf, %lf, %lf)\n:\n", a, b, c, d, e, f);
	}

//	ppos2file("./drawposits", indivs[0].posits, indivs[0].npos);
	
	return 0;
}
コード例 #8
0
int main()
{
   int edges;
   int vertices;
   int i=0, j=0, weight = 0, v1, v2, w;
   scanf("%d%d",&vertices,&edges);
   struct dslist v[vertices];
   struct edges e[edges];
   struct edges S[edges];
   int temp = edges; 
   while(edges){
   --edges;
   scanf("%d%d%d",&v1,&v2,&w);
   e[i].start = v1;
   e[i].end = v2;
   e[i].weight = w;
   i++;
   }
   
   first = NULL;
   last = NULL;
   struct dslist *node;
   node = first;
   for(i=0; i<vertices;  i++)
   {     struct ds *nd;
         nd = (struct ds *) malloc (sizeof (struct ds));
         nd->key = i;
         nd->p = NULL;
         nd->rank = 0;

         struct dslist *ndstr;
         ndstr = (struct dslist *) malloc (sizeof (struct dslist));
         ndstr->elem = nd;
         ndstr->next = NULL;
         if(first == NULL)
            {first = ndstr;
            first->next = NULL;
            last = first;}
         else{
            last->next = ndstr;
            last = ndstr;     
         }
         makeset(nd);
      };
   
   insertionsort(e, temp);
   for(i=0;i<temp; i++)
   {
      if((find(retpoint(e[i].start)))->key != (find(retpoint(e[i].end)))->key)
      {  S[j] = e[i];
         j++;
         combine(retpoint(e[i].start), retpoint(e[i].end));
      }
   }
   //printf("\n SORTED:");
   for(i=0; i<j; i++)
   {  weight += S[i].weight;
      //printf("%d %d",S[i].start,S[i].end);
   }
   
   printf("WEIGHT: %d\n",weight);
   print_matrix(S, vertices);

   return 0;
}
	Triangulator::Triangulator(const vector<CParticleF>& pnts)
	{
		for(int i=0; i<pnts.size(); ++i)
		{
			points.push_back(new _Internal::_vertex(pnts[i]));
		}

		vector<TriangulateBourke::Triplet> delaunayTriangles = TriangulateBourke::DelaunayTriangulation(pnts);
		/*if(tripletSanityCheck(delaunayTriangles, pnts.size()) > 0)
		{
			int i=0;
		}*/
		for(int i=0; i<delaunayTriangles.size(); i++)
		{
			int xk = delaunayTriangles[i].index[0];
			int yk = delaunayTriangles[i].index[1];
			int zk = delaunayTriangles[i].index[2];
			assert(xk>=0 && xk<pnts.size() && yk>=0 && yk<pnts.size() && zk>=0 && zk<pnts.size());
			CParticleF x = pnts[xk];
			CParticleF y = pnts[yk];
			CParticleF z = pnts[zk];

			float ccw = CounterClockWise(x, y, z);
			if(ccw > 0)
			{
				//arrange them in clockwise orientation
				swap(xk, zk);
				swap(x, z);
			}

			_Internal::_edge* tedges[3];
			tedges[0] = (new _Internal::_edge(points[xk], points[yk]));
			tedges[1] = (new _Internal::_edge(points[yk], points[zk]));
			tedges[2] = (new _Internal::_edge(points[zk], points[xk]));
			_Internal::_triangle* tr = new _Internal::_triangle(0, 0, 0, points[xk], points[yk], points[zk]);
			faces.push_back(tr);
			//add new edges to the edge vector. Make association with a new face and edges.
			for(int j=0; j<3; ++j)
			{
				vector<_Internal::_edge*>::iterator it = find_if(edges.begin(), edges.end(), _Internal::_edge_equal(tedges[j]));
				if(it == edges.end())
				{
					edges.push_back(tedges[j]);
				}
				else
				{
					delete tedges[j];
					tedges[j] = *it;
				}
				tr->edges[j] = tedges[j];
				tedges[j]->AddFace(tr);
			}
			points[xk]->AddEdge(tedges[0]);
			points[xk]->AddEdge(tedges[2]);
			points[yk]->AddEdge(tedges[0]);
			points[yk]->AddEdge(tedges[1]);
			points[zk]->AddEdge(tedges[1]);
			points[zk]->AddEdge(tedges[2]);
		}
		sort(edges.begin(), edges.end(), _Internal::_edge_less);
		//classify each edge. Initially, they are either Inside or Boundary.
		//After edge-removal, we can have Hole edges when an Inside edge is removed.
		for(int i=0; i<edges.size(); ++i)
		{
			if(isBoundary(edges[i]))
			{
				edges[i]->type = _Internal::Boundary;
			}
			else
			{
				edges[i]->type = _Internal::Inside;
			}
			Node<_Internal::_edge*>* node = makeset(edges[i]);
			vnodes.push_back(node);
			edges[i]->node = node;

		}
		//make a cluster of boundary edges. Initially, there is only one cluster
		Node<_Internal::_edge*>* root = NULL;
		for(int i=0; i<edges.size(); ++i)
		{
			if(edges[i]->type == _Internal::Boundary)
			{	
				if(root == NULL)
				{
					root = edges[i]->node;
				}
				else
				{
					merge(edges[i]->node, root);
				}
			}
		}
	}