za


/////////////////////////////////////
                    小藍書的內容


//
//  main.cpp
//  testTrue
//
//  Created by sj wang on 30/04/2017.
// 樹的dsf遍歷
//使用數組存樹的連接關係

#include <iostream>
using namespace std;
//book記錄頂點是否被訪問過了
//n 是頂點個數
//m 是邊個數
int book[101],sum,n,m,e[101][101];


//cur 是當前所在頂點的編號
void dfs(int cur){

    cout<<"Current is:"<<cur<<endl;

    int i;
    sum++;
    if(sum==n){return;}

    //從1到n號頂點依次嘗試,看看哪些與cur相連
    for(i=1; i<=n;i++){
        //有路,且該頂點沒有被訪問過
        if(e[cur][i]==1 && book[i]==0){

            book[i]=1;
            dfs(i);
        }

        return;
    }

}




int main(){

    m=5;
    n=5;

    e[1][2]=1;
    e[1][3]=1;
    e[1][5]=1;
    e[2][4]=1;
    e[3][5]=1;

    book[1]=1;
    dfs(1);

    system("pause");
    return 0;
}




//
//  main.cpp
//  testTrue
//
//  Created by sj wang on 30/04/2017.
//
// Page 151
// Folyd-Warshell find shortest path
// 求有向圖任意兩點間的最短距離

#include <iostream>
using namespace std;

int e[101][101];
int inf=999;

// input: the map, size mxm
void floyWarshellPath(int *e,int m, int inf){

    for(int k=1;k<=m; k++){

        for(int j=1; j<=m; j++){

            for(int i=1; i<=m; i++){

                if(e[i][j]>e[i][k] + e[k][j] && e[i][k]<inf && e[k][j]<inf){

                    e[i][j]=e[i][k]+e[k][j];
                }
            }
        }

    }



    for(int q=1; q<m; q++){
        for(int p=1; p<m; p++){
            cout<<e[q][p]<<"   ";
        }
        cout<<endl;
    }



}




int main(){

    e[1][1]=0;e[1][2]=2;e[1][3]=6;e[1][4]=4;
    e[2][1]=inf;e[2][2]=0;e[2][3]=3;e[2][4]=inf;
    e[3][1]=7;e[3][1]=inf;e[3][1]=0;e[3][1]=1;
    e[4][1]=5;e[4][2]=inf;e[4][3]=12;e[4][4]=0;


    system("pause");
    return 0;
}




// NOT TESTED
//  main.cpp
//  testTrue
//
//  Created by sj wang on 30/04/2017.
//  鏢局運輸:最小生成樹,並查集,快排
//  將整個地圖打通,全局看花費最少
//  先將代價排序,再依次選N-1個,如果形成迴路了就跳過這個
// 輸入各點的連接關係,如2 4 11,代表2連接4,且權重是11
// 輸出生成樹以後的總權重

#include <iostream>
using namespace std;

struct edge{

    int u;// a side
    int v;// a side
    int w;// wight of the two sides

}e[10];

int n,m;
int f[7]={0};
int sum=0;
int count=0;
// sort from index left to right
void quicksort(int left, int right){

    int i,j;
    struct edge t;

    if(left>right){return;}
    i=left; j=right;

    while(i!=j){

        while(e[j].w>=e[left].w && i<j){j--;}
        while(e[i].w<=e[left].w && i<j){i++;}

        if(i<j){
            t=e[i];
            e[i]=e[j];
            e[j]=t;
        }
    }

    t=e[left];
    e[left]=e[i];
    e[i]=t;

    quicksort(left, i-1);
    quicksort(i+1, right);
    return;
}


int getFather(int v){

    if(f[v]==v){return v;}
    else{
        f[v] = getFather(f[v]);
        return f[v];
    }
}

int merge(int v, int u){

    int t1,t2;
    t1=getFather(v);
    t2=getFather(u);

    if(t1!=t2){f[t2]=t1; return 1;}

    return 0;

}


int main(){


  n=6; m=9;
//把e[i].u, e[i].v, e[i].w都賦好值,分別代表點u連着v,權重是w

quicksort(1,m);

    //m: num of edges

    for(int i=1; i<=m; i++){

        if(merge(e.[i].u,e[i].v){
            countN++;
            sum=sum+e[i].w;
        }

        if(countN==n-1){break;}
    }



    system("pause");
    return 0;}




// FULL TESTED
//  main.cpp
//  testTrue
//
//  Created by sj wang on 30/04/2017.
//  圖的割點
//  用鄰接矩陣存連接關係,輸入:1 4 1 3 4 2 3 2 2 5 2 6 5 6 
//  輸出割點序號:2

#include <iostream>
using namespace std;



int n,m,e[9][9],root;

int num[9],low[9],flag[9];
int indexx;

//return smaller one of the two
int min(int a, int b){

    return a<b ? a:b;

}


void dfs(int cur, int father){
    int child=0;
    int i;

    indexx++;
    num[cur]=indexx;
    low[cur]=indexx;
    for(i=1; i<=n; i++){

        if(e[cur][i]==1){

            if(num[i]==0){
                child++;
                dfs(i,cur);

                low[cur]=min(low[cur],low[i]);

                if(cur!=root && low[i]>=num[cur]){flag[cur]=1;}

                if(cur==root && child==2){flag[cur]=1;}
            }


            else if(i!=father){
                low[cur]=min(low[cur],num[i]);
            }



        }
    }
    return;
}
int main(){


    n=6; m=7;

    for(int i=1; i<=n; i++){
        for(int j=1; j<=n; j++){
            e[j][i]=0;}
    }


    //
    //
    //
    e[1][4]=1;e[4][1]=1;e[1][3]=1;e[3][1]=1;
    e[4][2]=1;e[2][4]=1;e[3][2]=1;e[2][3]=1;
    e[2][5]=1;e[5][2]=1;e[2][6]=1;e[6][2]=1;
    e[5][6]=1;e[6][5]=1;

    //
    //
    //


    root=1;

    //從一號頂點開始dfs
    dfs(1,root);

    //如果是割點就打印出來
    for(int i=1; i<=n; i++){
        if(flag[i]==1){
            cout<<"cut point is : "<<i<<endl;
        }
    }
    //system("pause");
    cout<<"Tne "<<endl;
    getchar();getchar();
    return 0;
}




// FULL TESTED
//  main.cpp
//  testTrue
//
//  Created by sj wang on 30/04/2017.
//  圖的割邊
//  用鄰接矩陣存連接關係e
//  輸入: 1 4 1 3 4 2 3 2 2 5 5 6, 表示1與4相連,1與3。。。
//  輸出割點序號:5-6 2-5

#include <iostream>
using namespace std;



int n,m,e[9][9],root;

int num[9],low[9],flag[9];
int indexx;

//return smaller one of the two
int min(int a, int b){

    return a<b ? a:b;

}


void dfs(int cur, int father){

    int i;

    indexx++;
    num[cur]=indexx;
    low[cur]=indexx;

    for(i=1; i<=n; i++){

        if(e[cur][i]==1){

            if(num[i]==0){

                dfs(i,cur);

                low[cur]=min(low[i],low[cur]);

                if(low[i]>num[cur]){cout<<cur<<"-"<<i<<endl;}

            }


            else if(i!=father){
                low[cur]=min(low[cur],num[i]);
            }



        }
    }
    return;
}
int main(){


    n=6; m=7;

    for(int i=1; i<=n; i++){
        for(int j=1; j<=n; j++){
            e[j][i]=0;}
    }


    //
    //
    //
    e[1][4]=1;e[4][1]=1;e[1][3]=1;e[3][1]=1;
    e[4][2]=1;e[2][4]=1;e[3][2]=1;e[2][3]=1;
    e[2][5]=1;e[5][2]=1; e[5][6]=1;e[6][5]=1;

    //
    //
    //


    root=1;

    //從一號頂點開始dfs
    dfs(1,root);


    //system("pause");
    cout<<"Tne "<<endl;
    getchar();getchar();
    return 0;
}


// FULL TESTED
//  main.cpp
//  testTrue
//
//  Created by sj wang on 30/04/2017.
//  二分配對的最大值
//  用鄰接矩陣存連接關係,dfs
//  輸出最大對數: sum=3
//  輸入匹配關係,存到矩陣e中:1 4 1 5 2 5 2 6 3 4 ,表示1與4相連,1與5.。。。。。
#include <iostream>
using namespace std;


int e[101][101];
int match[101];
int book[101];
int n,m;

int dfs(int u){


    for(int i=1; i<=n; i++){

        if(book[i]==0 && e[u][i] == 1){

            book[i]=1;

            if(match[i]==0 || dfs(match[i])){

                match[i]=u; match[u]=i;
                return 1;
            }

        }

    }

    return 0;
}



int main(){


    //
    //
    //
    e[1][4]=1;e[4][1]=1;e[1][5]=1;e[5][1]=1;
    e[5][2]=1;e[2][5]=1;e[6][2]=1;e[2][6]=1;
    e[3][4]=1;e[4][3]=1;

    //
    //
    //



    int sum=0;
    // n pionts, m edges
    n=6; m=5;

    for(int i=1; i<=n; i++) match[i]=0;

    for(int i=1; i<=n; i++){

        for(int j= 1; j<=n; j++){
            book[j]=0;
        }

        if(dfs(i)) sum++;
    }


    cout<<"Sum is : "<<sum<<endl;




    cout<<"Tne "<<endl;
    getchar();getchar();
    return 0;
}



////////////////////////////////////

                        其他



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章