const int N = 1e3+5;
int Grid[N][N];Text
Text
void DFS(int I,int J){
// make sure (I,J) is marked visited
Output(I,J);
int nxt_i ,nxt_j;
for(int i=0;i<4;i++){
nxt_i=I+pos[i][0], nxt_j=J+pos[i][1];
// check if out of range
if(I_nxt_i_<1||nxt_i>1000||nxt_j<1||nxt_j>1000){
continue;
}
// check if visited
if(visited[nxt_i][nxt_j]) continue;
visited[nxt_i][nxt_j]=true;
DFS(nxt_i,nxt_j);
}
}int dir[4][2]={{0,1},{1,0},{0,-1},{-1,0}};
int cur_r ,cur_c ;
for(int i=0;i<4;i++){
int nxt_r=cur_r+ dir[i][0] ;
int nxt_c=cur_c+ dir[i][1] ;
}void DFS(int I,int J){
// make sure (I,J) is marked visited
Output(I,J);
int nxt_i ,nxt_j;
for(int i=0;i<4;i++){
nxt_i=I+pos[i][0], nxt_j=J+pos[i][1];
// check if out of range
if(I_nxt_i_<1||nxt_i>1000||nxt_j<1||nxt_j>1000) continue;
// check if visited
if(visited[nxt_i][nxt_j]) continue;
visited[nxt_i][nxt_j]=true;
DFS(nxt_i,nxt_j);
}
}while(q.size()){
I=q.front().F;
J=q.front().S;
q.pop();
for(int i=0;i<4;i++){
// next position
I__=I+pos[i][0], J__=J+pos[i][1];
if(!inRange(I__,J__)||vis[I__][J__]){
continue;
}
vis[I__][J__]=true;
Graph[I__][J__]=Graph[I][J]+1;
// count steps
q.push({I__,J__});
}
}while(q.size()){
I=q.front().F;
J=q.front().S;
q.pop();
for(int i=0;i<4;i++){
// next position
I__=I+pos[i][0], J__=J+pos[i][1];
if(!inRange(I__,J__)||vis[I__][J__]){
continue;
}
vis[I__][J__]=true;
Graph[I__][J__]=Graph[I][J]+1;
// count steps
q.push({I__,J__});
}
}#define F first
#define S second
typedef pair<int,int> pii;
queue<pii> q;
q.push( {R,C} );
while( q.size() ){ // not empty
BFS ...
}( ocean or land )
( 8 queen problem )
( 應該不屬於圖論但還是放上來ㄌ)
(8 direction BFS )
vertex
edge
Text
Text
9
2
1
6
10
4
4
5
10
3
6
7
4
2
2
2
3
2
3
1
1
1
1
2
1
1
0
1
2
1
0
1
2
1
0
Text
Text
4
1
2
3
| 1 | 2 | 3 | 4 | |
|---|---|---|---|---|
| 1 | ||||
| 2 | ||||
| 3 | ||||
| 4 |
| 0 | 1 | 1 | 0 | |
| 1 | 0 | 1 | 0 | |
| 1 | 1 | 0 | 1 | |
| 0 | 0 | 1 | 0 |
| 1 | 2 | 3 | 4 | |
|---|---|---|---|---|
| 1 | ||||
| 2 | ||||
| 3 | ||||
| 4 |
| 0 | 1 | 1 | 0 | |
| 0 | 0 | 0 | 0 | |
| 0 | 1 | 0 | 1 | |
| 0 | 0 | 0 | 0 |
4
1
2
3
4
1
2
3
| 1 | 2 | 3 | 4 | |
|---|---|---|---|---|
| 1 | ||||
| 2 | ||||
| 3 | ||||
| 4 |
| 0 | 5 | 3 | 0 | |
| 5 | 0 | 7 | 0 | |
| 3 | 7 | 0 | 6 | |
| 0 | 0 | 6 | 0 |
5
7
3
6
| 1 | 2 | 3 | 4 | |
|---|---|---|---|---|
| 1 | ||||
| 2 | ||||
| 3 | ||||
| 4 |
| 0 | 5 | 3 | 0 | |
| 0 | 0 | 0 | 0 | |
| 0 | 7 | 0 | 6 | |
| 0 | 0 | 0 | 0 |
4
1
2
3
5
7
3
6
int G[N][N];
int u ,v ;
while(m--){
// undirected
cin>>u>>v;
G[u][v]=1 ;
G[v][u]=1 ;
}int G[N][N];
int u ,v , wt;
while(m--){
// undirected
cin>>u>>v>>wt;
G[u][v]=wt ;
// G[v][u]=wt ; directed
}4
1
2
3
| 1 | |
|---|---|
| 2 | |
| 3 | |
| 4 |
| 2 3 | |
|---|---|
| 1 3 | |
| 1 2 4 | |
| 3 |
4
1
2
3
| 1 | |
|---|---|
| 2 | |
| 3 | |
| 4 |
| 2 3 | |
|---|---|
| 2 4 | |
4
1
2
3
5
7
3
6
| 1 | |
|---|---|
| 2 | |
| 3 | |
| 4 |
| (2,5) (3,3) | |
|---|---|
| (1,5) (3,7) | |
| (1,3) (2,7) (4,6) | |
| (3,6) |
4
1
2
3
5
7
3
6
| 1 | |
|---|---|
| 2 | |
| 3 | |
| 4 |
| (2,5) (3,3) | |
|---|---|
| (2,7) (4,6) | |
vector<int> Graph[N];
inline void Add_vertex_undirected(int a,int b){
// Undirected graph
Graph[a].push_back(b);
Graph[b].push_back(a);
}vector<pair<int,int> > Graph[N];
void Add_vertex_ditected(int v,int u,int e){
// edge
// v---------> u
// vertex v to u with edge= e
Graph[v].push_back({u,e});
}const int MAX_N = 1e5+5;
vector<int> G1[MAX_N];
vector<vector<int> > G2(MAX_N);