Advertisement
Guest User

boenje final

a guest
Apr 30th, 2016
67
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 5.27 KB | None | 0 0
  1. import java.io.File;
  2. import java.io.FileNotFoundException;
  3. import java.util.ArrayList;
  4. import java.util.HashSet;
  5. import java.util.Scanner;
  6.  
  7. // klasa za vrskite vo grafot
  8. class Edge{
  9.     int color; // 0 = neopredelena, 1 = crvena, 2 = sina
  10.     int vertex1; // indeksot na ednoto teme povrzano so ovaa vrska
  11.     int vertex2; // indeksot na drugoto teme povrzano so ovaa vrska
  12.     Edge(int v1, int v2){
  13.         color = 0;
  14.         vertex1 = v1;
  15.         vertex2 = v2;
  16.     }
  17. }
  18.  
  19. // klasa za teminjata vo grafot
  20. class Vertex{
  21.     ArrayList<Edge> vrski;
  22.     boolean hasRed; // oznacuva dali sodrzi barem edna crvena vrska
  23.     boolean hasBlue; // oznacuva dali sodrzi barem edna sina vrska
  24.     Vertex(){
  25.         vrski = new ArrayList<>();
  26.         hasRed = hasBlue = false;
  27.     }
  28.  
  29.     boolean isValid(){
  30.         // vrakja true ako ova teme gi ispolnuva uslovite na zadacata
  31.         return (vrski.size() < 2) || (hasRed && hasBlue);
  32.     }
  33. }
  34.  
  35. public class Main {
  36.     private static void colorEdge(Edge edge, int color, Vertex[] ver){
  37.         // ja boi dadenata vrska, so dadenata boja
  38.         edge.color = color;
  39.         if(color == 1){
  40.             //crvena
  41.             ver[edge.vertex1].hasRed = true;
  42.             ver[edge.vertex2].hasRed = true;
  43.         }
  44.         else{
  45.             //sina
  46.             ver[edge.vertex1].hasBlue = true;
  47.             ver[edge.vertex2].hasBlue = true;
  48.         }
  49.     }
  50.  
  51.     private static void runDfs(int first, Vertex[] ver){
  52.         int color = 1;
  53.         if(ver[first].hasRed) color = 2;
  54.  
  55.         int last = first;
  56.  
  57.         //DFS naogjanje i boenje na pat
  58.         HashSet<Integer> inStack = new HashSet<>();
  59.         while(true){
  60.             inStack.add(last);
  61.             boolean found = false;
  62.             for(Edge e : ver[last].vrski){
  63.                 // ako nema boja vrskata, i ako destinacijata ne e vo stack, oboi ja vrskata
  64.                 if(e.color == 0){ // proverka za boja na vrskata
  65.                     int dest = e.vertex1;
  66.                     if(dest == last) dest = e.vertex2;
  67.  
  68.                     if(!inStack.contains(dest)){ // proverka za dali e vo stackot temeto (za da se izbegne ciklus)
  69.                         colorEdge(e, color, ver);
  70.                         last = dest;
  71.                         color = 3 - color; // promena na color, ako e 1 ke stane 2, ako e 2 ke stane 1
  72.                         found = true;
  73.                         break;
  74.                     }
  75.                 }
  76.             }
  77.             if(!found){
  78.                 break;
  79.             }
  80.         }
  81.  
  82.         if(first == last){
  83.             //nevozmozno e da se oboi grafot
  84.             //for(Edge e : ver[first].vrski){
  85.             //    System.out.println("V1: " + e.color);
  86.             //}
  87.  
  88.             //System.out.println("YES: " + first);
  89.             System.out.println(0);
  90.             System.exit(0);
  91.         }
  92.  
  93.         // bidejki znaeme deka site teminja vnatre vo patot go ispolnuvaat uslovot,
  94.         // potrebno e samo da gi proverime pocetnoto teme i krajnoto teme.
  95.         // dokolku ne go ispolnuvaat uslovot, pustame DFS od tie teminja.
  96.         if(!ver[last].isValid()) runDfs(last, ver);
  97.         if(!ver[first].isValid()) runDfs(first, ver);
  98.     }
  99.  
  100.     public static void main(String[] args){
  101.         Scanner sc = new Scanner(System.in);
  102. //        Scanner sc = null;
  103. //        try {
  104. //            sc = new Scanner(new File("input.IN"));
  105. //        } catch (FileNotFoundException e) {
  106. //            e.printStackTrace();
  107. //        }
  108.  
  109.         int V = sc.nextInt();
  110.         int E = sc.nextInt();
  111.  
  112.         //System.out.println("V:" + V);
  113.  
  114.         // nizi vo koi ke gi cuvame teminjata i vrskite
  115.         Vertex[] ver = new Vertex[V];
  116.         Edge[] edg = new Edge[E];
  117.  
  118.         for(int i = 0; i < V; i++) ver[i] = new Vertex();
  119.  
  120.         // citanje input
  121.         for(int i = 0; i < E; i++) {
  122.             int a = sc.nextInt();
  123.             int b = sc.nextInt();
  124.  
  125.             // pretvoranje vo 0-based counting
  126.             a--;
  127.             b--;
  128.  
  129.             //kreiranje na vrskata
  130.             edg[i] = new Edge(a, b);
  131.             ver[a].vrski.add(edg[i]);
  132.             ver[b].vrski.add(edg[i]);
  133.         }
  134.  
  135.         // za sekoe teme za koe ne e ispolnet uslovot na zadacata, ja povikuvame
  136.         // DFS procedurata koja ke najde proizvolen pat koj pocnuva od toa teme
  137.         // i ke go oboi.
  138.         for(int i = 0; i < V; i++){
  139.             if(ver[i].vrski.size() > 2 && !ver[i].isValid()){ // najprvin gi sreduvame teminjata so stepen pogolem od 2, ako takvi ima vo grafot
  140.                 //temeto ne go ispolnuva uslovot
  141.                 runDfs(i, ver);
  142.             }
  143.         }
  144.  
  145.         for(int i = 0; i < V; i++){
  146.             if(!ver[i].isValid()){ // sega gi sreduvame ostanatite teminja
  147.                 //temeto ne go ispolnuva uslovot
  148.                 runDfs(i, ver);
  149.             }
  150.         }
  151.  
  152.         // pecatenje na shemata za boenje
  153.         StringBuilder sb = new StringBuilder();
  154.         for(int i = 0; i < E; i++){
  155.             int color = edg[i].color;
  156.             if(color == 0){
  157.                 // redundantna vrska, moze da bide bilo koja boja, ke ja oboime crvena, bidejki ne e bitno
  158.                 color = 1;
  159.             }
  160.             sb.append(color);
  161.         }
  162.         System.out.println(sb);
  163.     }
  164. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement