forked from: A panel for exercises on graphs ver2

by WinField95
♥0 | Line 531 | Modified 2012-01-07 18:47:27 | MIT License
play

ActionScript3 source code

/**
 * Copyright WinField95 ( http://wonderfl.net/user/WinField95 )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/hOpy
 */

// forked from WinField95's A panel for exercises on graphs  ver2
// forked from WinField95's A panel for exercises on graphs  ver2
// forked from WinField95's A panel for exercises on graphs
// forked from WinField95's flash on 2011-8-16
package {
   
    import flash.display.Sprite;
    import flash.text.*;
    import flash.events.MouseEvent;
    import flash.geom.*;

    
    //[SWF(backgroundColor = 0xED1A3D, frameRate = 40, width = 465, height = 465)]
    
    public class main extends Sprite {
        
       public var textArea:Sprite;          
        
        public function main() {
            
            
            var back:Sprite = new Sprite(); // back_bround
            
            back.graphics.beginFill(0x000000);
            back.graphics.drawRect(-500,-500,2000,1000);
            back.graphics.endFill();
            addChild(back);           
            
            
            
            
            textArea=new Sprite();
            textArea.y=50;
            addChild(textArea);
            
            
             var format:TextFormat=new TextFormat();
          
             
            var guide:TextField=setTextField(format,150,0,0,0);
            guide.text="Please input matrix";                
            

           
            var g_res1:TextField=setTextField(format,380,0,0,0);
            g_res1.text = "Connectivity";
            var g_res2:TextField=setTextField(format,470,70,0,0);
            g_res2.text = "Existence of 2 or more edges for each node";
            var g_res3:TextField=setTextField(format,450,120,0,0);
            g_res3.text = "absence of cutting edges and nodes";
            var g_res4:TextField=setTextField(format,440,175,0,0);
            g_res4.text = "Calculation of all shortest paths";
            var g_res5:TextField=setTextField(format,440,235,0,0);
            g_res5.text = "summation of all shortest paths";
            var g_res6:TextField=setTextField(format,380,290,0,0);
            g_res6.text = "diameter";
            var g_res7:TextField=setTextField(format,450,350,0,0);
            g_res7.text = "The summation of the shortest \n paths related to each single source";

            
            var a1:TextField=setTextField(format,20,50,300,320,300);//(format,5,30,300,300,300)
 
            
            a1.visible = true;
            a1.multiline = true;
            
            a1.backgroundColor=0xFFFFFF;
            a1.text="";
            
  
            var bf:Boolean = true;
            
                var bt:Button = new Button('START',130)
                bt.x = 20;
                bt.y = 440;
                bt.addEventListener(MouseEvent.CLICK, start);
                addChild(bt);
          
            
           //------------------------------- main process ----------------------------------------
           var n:int;
           const INF:int = 1000000000;
           const MAX:int = 100;
            
           var g:Array = new Array(MAX);
           for(var i:int = 0 ; i < MAX ; i++){
               g[i] = new Array(MAX);
           }

          //------------------------------------  func1 --------------------------------------------------------------------
           
          function func1():void{

            var flag1:Array = new Array(n);
            for(var i:int = 0 ; i < n ; i++){
                flag1[i] = false;
            }
              var Q:Queue = new Queue();
              
             for(var i:int = 0 ; i < n ;i++){
                 if(g[0][i] != INF){
                     Q.enqueue(i);
                     flag1[i] = true;
                 }
             }
             while(!Q.empty()){
                 var ind:int = Q.dequeue();
                 for(var i:int = 0 ; i < n ; i++){
                     if(g[ind][i]!= INF && !flag1[i]){
                         Q.enqueue(i);
                         flag1[i] = true;
                     }
                 }
             }

            var f1:Boolean = true;
            for(var i:int = 0 ; i < n ; i++){
                if(!flag1[i])f1 = false;
            }
            if(f1) r1str = "TRUE";
            else r1str = "FALSE";                       
          }                      
          
          // -------------------------------------------- func2 ----------------------------------------------------
          
          function func2():void{
              var flag:Boolean = true;
              for(var i:int = 0 ; i < n ;  i++){
                  var cnt:int = 0 ;
                  for(var j:int = 0 ; j < n ; j++){
                      //if(i == j)continue;
                      if(g[i][j] != INF)cnt++;
                  }
                  if(cnt < 2)flag = false;
              }
              if(flag)r2str = "TRUE";
              else r2str = "FALSE";
          }
          
          
          var bridge:Array = new Array(MAX);
          for(var i:int = 0 ; i < MAX ; i++){
              bridge[i] = new Array(MAX);
          }
          var low:Array = new Array(MAX);
          var d:Array = new Array(MAX);
          var color:Array = new Array(MAX);
          var bcnt:int = 0 ;

          // -------------------------------------------- func3 -----------------------------------------------------
          // -------------------------------------------- dfs -------------------------------------------------------
          function dfs(u:int,parent:int,deep:int):void{
              color[u] = 1;
              d[u] = low[u] = deep;
                  for(var i:int = 0 ; i < n ; i++){
                      if(g[u][i] == INF)continue;
                  
                      var v:int = i;
                      if(color[v] == 1 && v != parent) low[u] = low[u] < d[v] ? low[u] : d[v];
                      if(color[v] == 0){
                      dfs(v,u,deep + 1);
                      low[u] = low[u] < low[v] ? low[u] : low[v];
                      if(low[v] > d[u]){
                          bcnt++;
                          bridge[u][v] = bridge[v][u] = 1;
                      }
                  }
                }
              color[u] = 2;  
          }
          //--------------------------------------------- dfs end ------------------------------------------------------
          
          
          function func3():void{
    
                              
               bcnt = 0;
               for(var i:int = 0 ; i < n ; i++)d[i] = 0 ;
               for(var i:int = 0 ; i < n ; i++)color[i] = 0 ;
               for(var i:int  = 0 ; i < n ; i++)low[i] = 0;
               for(var i:int  = 0 ; i < n ; i++){
                   for(var j:int = 0 ; j < n ; j++){ 
                       bridge[i][j] = 0;
                   }
               }
    
    
               
               for(var i:int = 0 ; i < n ; i++){
               if(!color[i])dfs(i,0,0);
              } 
              
              r3str = "bridge \n";
              
              for(var i:int = 0 ; i < n ; i++){
                  for(var j:int = i+1 ; j < n ; j++){
                      if(bridge[i][j])r3str += i + " - " + j + "\n";
                  }
              }


            var degree:Array = new Array(n);
            for(var i:int = 0 ; i < n ; i++)degree[i] = 0 ;

            for(var i:int = 0 ; i < n ; i++){
                for(var j:int  = 0 ; j < n ; j++){
                    
                    if(i == j)continue;
                    if(g[i][j] != INF)degree[i]++;
                }
            }


              r3str += "articulation points \n";
              
              for(var i:int = 0 ; i < n ; i++){
                  for(var j:int = 0 ; j < n ; j++){
                      if(bridge[i][j]){
                          if(degree[i] > 1)r3str += i + "\n";
                          if(degree[j] > 1)r3str += j + "\n";
                          degree[i] = 0;
                          degree[j] = 0;
                      }
                  }
              }             
          }
          // -----------------------------------------------  func4 ---------------------------------------------------
          
          var d_sum:Array = new Array(n);          
     
          function func4():void{
              for(var k:int = 0 ; k < n ; k++){
                  for(var i:int = 0 ; i < n ; i++){
                      for(var j:int = 0 ; j < n ; j++){
                          if(g[i][j] > g[i][k] + g[k][j]) g[i][j] = g[i][k] + g[k][j];
                      }
                  }
              }
             
             for(var i:int = 0 ; i < n ; i++) d_sum[i] = 0;                       

             for(var i:int = 0 ; i < n ; i++){
                  for(var j:int = 0 ; j < n ; j++){
                     if(g[i][j] != INF)d_sum[i] += g[i][j];
                  }
             }

             
             
             
             
             for(var i:int = 0 ; i < n ; i++){
                for(var j:int = 0 ; j < n ; j++){ 
                    if(g[i][j] == INF) r4str += 'x';
                    else{
                        r4str += g[i][j];
                    }
                    r4str += ' ';
                   }
                  r4str += '\n';
             }
          }
              
         // ---------------------------------------------------- func5 --------------------------------------------------
              
          function func5():void{
              var sum:int = 0;
              for(var i:int = 0 ; i < n ; i++){
                  for(var j:int = 0 ; j < n ; j++){
                      if(g[i][j] != INF)sum += g[i][j];
                  }
              }
              sum /= 2;
             r5str = sum.toString();
          }
          
          //--------------------------------------------------- func6 ----------------------------------------------------
          
          function func6():void{
              
              var maxi:int = 0;
              for(var i:int = 0 ; i < n ; i++){
                  for(var j:int = 0 ; j < n ; j++){
                      if(g[i][j] != INF){
                         // maxi = max(maxi,g[i][j]);
                         if(maxi <= g[i][j])maxi = g[i][j];
                         
                      }
                  }
              }
              r6str = maxi.toString();
          }
//-------------------------------------------------------------------------------------------------------------------------
         
         var testStr:String = new String();// test
         
         var r1str:String = new String();
         var r2str:String = new String();
         var r3str:String = new String();
         var r4str:String = new String();
         var r5str:String = new String();
         var r6str:String = new String();
         var r7str:String = new String();
         
         
//------------------------------------------------- perse ---------------------------------------------------------------
         function parsing(str:String): Array{
          
              var res:Array = new Array();
              var tmp:int = 0;
              a1.text = "";
              //var c:String = str.charAt(0);
             // a1.text += c;
              
              var blank:Boolean = true;
              
               for(var i:int = 0 ; i < str.length; i++){
//      cout << str[i];//

               //var c:char = str.charAt(i);
                  
                var c:String = str.charAt(i); 
                
                
                if('0' <= c.charAt(0) && c.charAt(0) <= '9'){
                     tmp *= 10;
                     tmp += parseInt(c.charAt(0)); 
                     blank = true;
                  }
 
                 else if(c == "x"){
                 tmp = INF;
                 blank = true;
                 }
                 else if(blank){
                 blank = false; 
                 res.push(tmp);
                 tmp = 0;
                 }
                 
                if(i == str.length -1)res.push(tmp); 
                 
               }
//   cout << endl;//

//a1.text = "fhfh";


       return res;
             
   }

         
//------------------------------------------------ check --------------------------------------------------------------
   /*
         function check(str:String):Boolean{
             for(var i:int = 0 ; i < str.length ; i++){
                  var c:String = str.charAt(i); 
                
                 if(!( ('0' <= c.charAt(0) && c.charAt(0) <= '9') || c == "x"|| c == ",")){
                    guide.text = c;
                    return true;
                  }
             }
          return false;
         }
    */     
         
       // ------------------------------------------ start ------------------------------------------------------  
         function start():void{
             // a1.text = "!!!!!!!!!"; // test
             
                         
            var btr:Button = new Button('RESET',130)
            btr.x = 190;
            btr.y = 440;
            btr.addEventListener(MouseEvent.CLICK, reset);
            addChild(btr);      
          
                var dt:Dummy = new Dummy('START',130)
                dt.x = 20;
                dt.y = 440;
                addChild(dt);       
             
             
             
             
             if(a1.text == ""){
                 guide.text = " is not correct data! Please input the data !"
                 return;
             }
           

              r7str = a1.text;

         
              var myPattern:RegExp = /$./sgm;
               
               var input:Array = a1.text.split(myPattern);
               //n = input[0].length/2 + 1; // change from input[0].length/2 + 1; 
               
               n = input.length;

 //   a1.text = "!!!!!!!"


                var temp:Array = new Array(n);

                for(var i:int = 0 ; i < n ; i++){
                  temp[i] = parsing(input[i]);
                }
     
     /*           
                for(var i:int = 0 ; i < n ; i++){
                    if(check(temp[i])){
                       guide.text = "Please input the correct format data!"
                       return ;
                    }
                }
*/
             
                a1.text = "";
                    
                for(var i:int = 0 ; i < n ; i++){
                   for(var j:int = 0 ; j < n ; j++){
                    if(temp[i][j] == INF) a1.text += "x";
                    else a1.text += temp[i][j];
                    a1.text += " ";       
                   }
                   a1.text += '\n';
                }


                for(var i:int = 0 ; i < n ; i++){
                    for(var j:int = 0 ; j < n ; j++){
                        g[i][j] = temp[i][j];
                    }
                }




    /*
               
             myPattern = / /;
             var temp:Array = new Array(n);
             for(var i:int = 0 ; i < n ; i++){
                 temp[i] = new Array(n);
             }

             
             for(var i:int = 0 ; i < n ; i++){
                 var sp:Array = input[i].split(myPattern);
                 for(var j:int = 0 ; j < n ; j++){
                     temp[i][j] = sp[j];
                 }
             }
             
    
               for(var i:int = 0 ; i < n ; i++){
                   for(var j:int = 0 ; j < n ;j++){
                    if(temp[i][j] == 'x' || temp[i][j] == 'X')g[i][j] = INF;
                    else if('0' <= temp[i][j] && temp[i][j] <= '9')g[i][j] = parseInt(temp[i][j]);   
                    else {
                       guide.text = "Please input the correct format data!"
                       return ;
                    }             
                   }
               }

*/

                bf = false;
                
                                     
                func1();        
                func2();
                func3();
                func4();
                func5();
                func6();   
                
                      
            var bt3:Button = new Button('button1',50)
            bt3.x = 350;
            bt3.y = 80;
            bt3.addEventListener(MouseEvent.CLICK, b_func1);
            addChild(bt3);
            
            var bt4:Button = new Button('button2',50)
            bt4.x = 350;
            bt4.y = 140;
            bt4.addEventListener(MouseEvent.CLICK, b_func2);
            addChild(bt4);
            
            var bt5:Button = new Button('button3',50)
            bt5.x = 350;
            bt5.y = 190;
            bt5.addEventListener(MouseEvent.CLICK, b_func3);
            addChild(bt5);
            
            var bt6:Button = new Button('button4',50)
            bt6.x = 350;
            bt6.y = 250;
            bt6.addEventListener(MouseEvent.CLICK, b_func4);
            addChild(bt6);
            
            var bt7:Button = new Button('button5',50)
            bt7.x = 350;
            bt7.y = 310;
            bt7.addEventListener(MouseEvent.CLICK, b_func5);
            addChild(bt7);
            
            var bt8:Button = new Button('button6',50)
            bt8.x = 350;
            bt8.y = 365;
            bt8.addEventListener(MouseEvent.CLICK, b_func6);
            addChild(bt8);
            
            var bt9:Button = new Button('button7',50)
            bt9.x = 350;
            bt9.y = 440;
            bt9.addEventListener(MouseEvent.CLICK, b_func7);
            addChild(bt9);        
    
               guide.text = "  Please push the button    "                  

         }
           
           
           //----------------------------------------   reset    ------------------------------------------
           
           
           
           function reset():void{
               //a1.text = "";
               r1str = "";
               r2str = "";
               r3str = "";
               r4str = "";
               r5str = ""; 
               r6str = "";
               r7str = "";
   
               a1.text = "";
               a1.multiline = true;
               bf = true;
            
               guide.text = "Please input matrix";
               
               makeDummy();
               
                  var bt:Button = new Button('START',130)
                bt.x = 20;
                bt.y = 440;
                bt.addEventListener(MouseEvent.CLICK, start);
                addChild(bt);
               
           }

 
 
   //---------------------------------------  button function ----------------------------------------------------
 

            function b_func1():void{
                if(bf)return;
                guide.text = "  Connectivity    "   
                 a1.text = r1str;
            }

            function b_func2():void{
                if(bf)return;
                guide.text = " Existence of 2 or more edges for each node     "   
                 a1.text = r2str;
            }

            function b_func3():void{
                if(bf)return;
                guide.text = "   absence of cutting edges and nodes  "   
                 a1.text = r3str;
            }

            function b_func4():void{
                if(bf)return;
                guide.text = "    Calculation of all shortest paths  "   
                a1.text = r4str;
            }

            function b_func5():void{
                if(bf)return;
                guide.text = "  summation of all shortest paths "   
                a1.text = r5str;
            }

            function b_func6():void{
                if(bf)return;
                guide.text = "   diameter    "   
                a1.text = r6str;
            }


            function b_func7():void{
                if(bf)return;
                guide.text = " The summation of the shortest \n paths related to each single source  "   
            a1.text = "";
            for(var i:int = 0 ; i < n ; i++){
               a1.text += "node " + i + " : " ;      
               a1.text += d_sum[i];
               a1.text +=  "\n";            
             }
            }                           
         makeDummy();  
        }
           
        
    
        private function makeDummy():void{
            var d3:Dummy= new Dummy('button1',50)
            d3.x = 350;
            d3.y = 80;
            addChild(d3);
            
            var d4:Dummy = new Dummy('button2',50)
            d4.x = 350;
            d4.y = 140;
            addChild(d4);
            
            var d5:Dummy= new Dummy('button3',50)
            d5.x = 350;
            d5.y = 190;
            addChild(d5);
            
            var d6:Dummy = new Dummy('button4',50)
            d6.x = 350;
            d6.y = 250;
            addChild(d6);
            
            var d7:Dummy = new Dummy('button5',50)
            d7.x = 350;
            d7.y = 310;
            addChild(d7);
            
            var d8:Dummy = new Dummy('button6',50)
            d8.x = 350;
            d8.y = 365;
            addChild(d8);
            
            var d9:Dummy = new Dummy('button7',50)
            d9.x = 350;
            d9.y = 440;
            addChild(d9);
        
            var dtr:Dummy = new Dummy('RESET',130)
            dtr.x = 190;
            dtr.y = 440;
            addChild(dtr);      

        }
        
        
        private function setTextField(_format:TextFormat,_x:uint=0,_y:uint=0,_w:uint=100,_h:uint=40,_type:uint=0):TextField {
            _format.color=0x000000
            _format.size=15;
            _format.leading = 1;
            _format.align = "left"

            
            
            var tbox:TextField=new TextField()
            tbox.x=_x;
            tbox.y=_y;
            tbox.width=_w;
            tbox.height=_h;
        
            if (_type) {
                tbox.type=TextFieldType.INPUT
                tbox.background=true;
                tbox.backgroundColor=0xFFFFFF
                tbox.selectable=true;
                tbox.mouseEnabled=true;
                _format.color=0x000000
            } else {
                tbox.autoSize=TextFieldAutoSize.CENTER
                tbox.selectable=false;
                tbox.mouseEnabled=false;
                _format.color=0xFFFFFF
            }

            tbox.defaultTextFormat=_format
            textArea.addChild(tbox);

            return tbox;
        }
        
        
    }
}
// ------------------------------------------------ Button Class --------------------------------------------------------------

import flash.display.*;
import flash.text.*;
class Button extends SimpleButton
{
    public function Button(label:String, width:int = 0):void
    {
        var up:Sprite = _buildImage(label, 0xCCCCCC, width);
        var over:Sprite = _buildImage(label, 0x87CEFA, width);
        var down:Sprite = _buildImage(label, 0x4682B4, width);
        down.y = 1;
        super(up, over, down, up);
    }

    public function _buildImage(label:String, color:int, width:int = 0):Sprite
    {
       
        var text:TextField = new TextField();
        text.defaultTextFormat = new TextFormat('Verdana', 10, 0x000000, true, null, null, null, null, TextFormatAlign.CENTER);
        text.autoSize = TextFieldAutoSize.CENTER;
        text.selectable = false;
        text.text = label;
        text.x = (width - text.width) >> 1;
        text.y = 5;
        var base:Shape = new Shape();
        var g:Graphics = base.graphics;
        g.beginFill(color);
        g.drawRect(0, 0, width, text.height + 3);
        g.endFill();
        var sp:Sprite = new Sprite();
        sp.addChild(base);
        sp.addChild(text);
        return sp;
        
    }        
}


    // ---------------------------------------------- dummy ---------------------------------------------------------------
    
    

class Dummy extends SimpleButton
{
    public function Dummy(label:String, width:int = 0):void
    {
        var up:Sprite = _buildImage(label, 0xCC9999, width);
        var over:Sprite = _buildImage(label, 0xCC9999, width);
        var down:Sprite = _buildImage(label, 0xCC9999, width);
        down.y = 1;
        super(up, over, down, up);
    }

    public function _buildImage(label:String, color:int, width:int = 0):Sprite
    {
       
        var text:TextField = new TextField();
        text.defaultTextFormat = new TextFormat('Verdana', 10, 0x000000, true, null, null, null, null, TextFormatAlign.CENTER);
        text.autoSize = TextFieldAutoSize.CENTER;
        text.selectable = false;
        text.text = label;
        text.x = (width - text.width) >> 1;
        text.y = 5;
        var base:Shape = new Shape();
        var g:Graphics = base.graphics;
        g.beginFill(color);
        g.drawRect(0, 0, width, text.height + 3);
        g.endFill();
        var sp:Sprite = new Sprite();
        sp.addChild(base);
        sp.addChild(text);
        return sp;
        
    }        
}


    // -----------------------------------------------  queue ----------------------------------------------------------------------
    
class Queue
{
    private var data:Array = [];
 
    public function Queue()
    {
        data = new Array();
    }
 
    public function enqueue(obj:*):void
    {
        data[data.length] = obj;
    }
 
    public function dequeue():*
    {
        return data.splice(0, 1);
    }
 
    public function peek():*
    {
        return data[0];
    }
 
    public function empty():Boolean
    {
        return data.length == 0;
    }
 
    public function print():void
    {
        trace(data);
    }
}