/////////////////////////////////////
小藍書的內容
//
// 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;
}
////////////////////////////////////
其他
za
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.