# 資料結構(0509)程式碼
**graph_1.c**
```graphviz
graph G {
rankdir = LR;
1 -- 2;
1 -- 3;
2 -- 3;
2 -- 4;
3 -- 5;
4 -- 5;
}
```
```c=
#include <stdio.h>
#define V 5
#define E 12
typedef struct node_to_node {
int src;
int dest;
} Edge;
void show_graph();
int A[V][V] = {0};
int main() {
Edge edges[] = {{1,2},{1,3},{2,1},{2,3},{2,4},{3,1},
{3,2},{3,5},{4,2},{4,5},{5,3},{5,4}};
int i;
for (i = 0; i < E ; i++) {
A[edges[i].src - 1][edges[i].dest - 1] = 1;
}
show_graph();
return 0;
}
void show_graph() {
int i, j;
for (i = 0; i < V; i++) {
for (j = 0; j < V; j++) {
printf("%2d", A[i][j]);
}
printf("\n");
}
}
```
**is_path.c**
```c=
#include <stdio.h>
#define FALSE 0
#define TRUE 1
#define NODES 7
#define EDGES 9
int edge_list[EDGES][2]= {{0,1},{0,2},{1,3},{1,4},{2,1},{3,6},{4,6},{5,1},{5,6}};
int adjmat[NODES][NODES];
void make_adjmat(void);
int is_path(int va, int vb);
int main() {
int src, dst;
for (dst=0; dst<NODES; dst++) {
printf("%4d", dst);
}
printf("\n");
for (src=0; src<NODES; src++) {
printf("%d: ", src);
for (dst=0; dst<NODES; dst++) {
make_adjmat();
if (is_path(src,dst))
printf("Yes ");
else
printf("No ");
}
printf("\n");
}
return 0;
}
void make_adjmat() {
int k;
for (k=0; k<EDGES; k++)
adjmat[edge_list[k][0]][edge_list[k][1]]=TRUE;
}
int is_path(int va, int vb) {
int k, found;
if (adjmat[va][vb]>0)
return TRUE;
found=FALSE;
k=0;
while ((k<NODES) && !found) {
if (adjmat[va][k]>0) {
adjmat[va][k]*=-1;
found=is_path(k,vb);
if (!found)
adjmat[va][k]*=-1;
}
k++;
}
return found;
}
```
```graphviz
digraph G {
rankdir = LR;
0 -> 1;
0 -> 2;
1 -> 2;
2 -> 0;
2 -> 3;
3 -> 3;
}
```
**GraphBFS.cpp**
```c=
#include<iostream>
#include <list>
using namespace std;
class Graph {
int V;
list<int> *adj;
public:
Graph(int V);
void addEdge(int v, int w);
void BFS(int s);
};
Graph::Graph(int V) {
this->V = V;
adj = new list<int>[V];
}
void Graph::addEdge(int v, int w) {
adj[v].push_back(w);
}
void Graph::BFS(int s) {
bool *visited = new bool[V];
for(int i = 0; i < V; i++)
visited[i] = false;
list<int> queue;
visited[s] = true;
queue.push_back(s);
list<int>::iterator i;
while(!queue.empty()) {
s = queue.front();
cout << s << " ";
queue.pop_front();
for (i = adj[s].begin(); i != adj[s].end(); ++i) {
if (!visited[*i]) {
visited[*i] = true;
queue.push_back(*i);
}
}
}
}
int main() {
Graph g(4);
g.addEdge(0, 1);
g.addEdge(0, 2);
g.addEdge(1, 2);
g.addEdge(2, 0);
g.addEdge(2, 3);
g.addEdge(3, 3);
cout << "Following is Breadth First Traversal "
<< "(starting from vertex 2) \n";
g.BFS(2);
return 0;
}
```
**GraphDFS.cpp**
```c=
#include <bits/stdc++.h>
using namespace std;
class Graph {
public:
map<int, bool> visited;
map<int, list<int> > adj;
void addEdge(int v, int w);
void DFS(int v);
};
void Graph::addEdge(int v, int w) {
adj[v].push_back(w);
}
void Graph::DFS(int v) {
visited[v] = true;
cout << v << " ";
list<int>::iterator i;
for (i = adj[v].begin(); i != adj[v].end(); ++i)
if (!visited[*i])
DFS(*i);
}
int main() {
Graph g;
g.addEdge(0, 1);
g.addEdge(0, 2);
g.addEdge(1, 2);
g.addEdge(2, 0);
g.addEdge(2, 3);
g.addEdge(3, 3);
cout << "Following is Depth First Traversal "
<< "(starting from vertex 2) \n";
g.DFS(2);
return 0;
}
```