Changeset 2448:ab899ae3505f in lemon-0.x for tools/lgf-gen.cc
- Timestamp:
- 06/05/07 16:48:20 (17 years ago)
- Branch:
- default
- Phase:
- public
- Convert:
- svn:c9d7d8f5-90d6-0310-b91f-818b3a526b0e/lemon/trunk@3285
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
tools/lgf-gen.cc
r2447 r2448 533 533 } 534 534 535 Node common(UEdge e, UEdge f)536 {537 return (g.source(e)==g.source(f)||g.source(e)==g.target(f))?538 g.source(e):g.target(e);539 }540 541 535 void tsp2() 542 536 { … … 553 547 for(NodeIt n(g);n!=INVALID;++n) 554 548 if(countIncEdges(g,n)%2==1) leafs.push_back(n); 555 for(unsigned int i=0;i<leafs.size();i+=2) 556 g.addEdge(leafs[i],leafs[i+1]); 549 550 // for(unsigned int i=0;i<leafs.size();i+=2) 551 // g.addEdge(leafs[i],leafs[i+1]); 552 553 std::vector<Pedge> pedges; 554 for(unsigned int i=0;i<leafs.size()-1;i++) 555 for(unsigned int j=i+1;j<leafs.size();j++) 556 { 557 Node n=leafs[i]; 558 Node m=leafs[j]; 559 Pedge p; 560 p.a=n; 561 p.b=m; 562 p.len=(coords[m]-coords[n]).normSquare(); 563 pedges.push_back(p); 564 } 565 std::sort(pedges.begin(),pedges.end(),pedgeLess); 566 for(unsigned int i=0;i<pedges.size();i++) 567 if(countIncEdges(g,pedges[i].a)%2 && 568 countIncEdges(g,pedges[i].b)%2) 569 g.addEdge(pedges[i].a,pedges[i].b); 557 570 } 558 571 559 572 for(NodeIt n(g);n!=INVALID;++n) 560 if(countIncEdges(g,n)%2 )573 if(countIncEdges(g,n)%2 || countIncEdges(g,n)==0 ) 561 574 std::cout << "GEBASZ!!!" << std::endl; 562 575 576 for(UEdgeIt e(g);e!=INVALID;++e) 577 if(g.source(e)==g.target(e)) 578 std::cout << "LOOP GEBASZ!!!" << std::endl; 579 563 580 std::cout << "Number of edges : " << countUEdges(g) << std::endl; 564 565 // for(NodeIt n(g);n!=INVALID;++n)566 // if(countIncEdges(g,n)>2)567 // std::cout << "+";568 // std::cout << std::endl;569 581 570 582 std::cout << "Total edge length (euler) : " << totalLen() << std::endl; 571 583 572 ListUGraph::UEdgeMap< UEdge> enext(g);584 ListUGraph::UEdgeMap<Edge> enext(g); 573 585 { 574 586 UEulerIt<ListUGraph> e(g); 575 UEdge eo=e;576 UEdge ef=e;587 Edge eo=e; 588 Edge ef=e; 577 589 // std::cout << "Tour edge: " << g.id(UEdge(e)) << std::endl; 578 590 for(++e;e!=INVALID;++e) … … 584 596 enext[eo]=ef; 585 597 } 586 598 587 599 std::cout << "Creating a tour from that..." << std::endl; 588 600 … … 590 602 int ednum = countUEdges(g); 591 603 592 for( UEdge p=UEdgeIt(g);ednum>nnum;p=enext[p])604 for(Edge p=enext[UEdgeIt(g)];ednum>nnum;p=enext[p]) 593 605 { 594 606 // std::cout << "Checking edge " << g.id(p) << std::endl; 595 UEdge e=enext[p];596 UEdge f=enext[e];597 Node n2= common(e,f);607 Edge e=enext[p]; 608 Edge f=enext[e]; 609 Node n2=g.source(f); 598 610 Node n1=g.oppositeNode(n2,e); 599 611 Node n3=g.oppositeNode(n2,f); … … 601 613 { 602 614 // std::cout << "Remove an Edge" << std::endl; 603 UEdge ff=enext[f];615 Edge ff=enext[f]; 604 616 g.erase(e); 605 617 g.erase(f); 606 UEdge ne=g.addEdge(n1,n3); 607 enext[p]=ne; 608 enext[ne]=ff; 609 ednum--; 618 if(n1!=n3) 619 { 620 Edge ne=g.direct(g.addEdge(n1,n3),n1); 621 enext[p]=ne; 622 enext[ne]=ff; 623 ednum--; 624 } 625 else { 626 enext[p]=ff; 627 ednum-=2; 628 } 610 629 } 611 630 } … … 613 632 std::cout << "Total edge length (tour) : " << totalLen() << std::endl; 614 633 634 std::cout << "2-opt the tour..." << std::endl; 635 615 636 tsp_improve(); 616 637 … … 762 783 tlen+=sqrt((coords[g.source(e)]-coords[g.target(e)]).normSquare()); 763 784 std::cout << "Total edge length : " << tlen << std::endl; 785 764 786 if(ap["eps"]) 765 787 graphToEps(g,prefix+".eps"). 766 788 scale(600).nodeScale(.2).edgeWidthScale(.001).preScale(false). 767 789 coords(coords).run(); 768 790 769 791 if(ap["dir"]) 770 792 GraphWriter<ListUGraph>(prefix+".lgf",g).
Note: See TracChangeset
for help on using the changeset viewer.