P1205 田野上的环
2017年5月16日
- DFS+邻接矩阵
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
#define maxx 300
int N, M;
int K[maxx][maxx];
bool vis[maxx];
bool Jud[maxx];
void Inserts()
{
cin >> N >> M;
memset(K, 0, sizeof(K));
memset(vis, true, sizeof(vis));
memset(Jud, false, sizeof(Jud));
for(int i = 1; i <= M; i++){
int x, y;
cin >> x >> y;
K[x][y] = 1; K[y][x] = 1;
}
}
void DFS(int s)
{
for(int i = 1; i <= N; i++)
if(K[s][i] == 1 && vis[i] == true){
vis[i] = false; Jud[i] = true;
DFS(i);
}
}
void Printout()
{
bool flag = false;
for(int i = 2; i <= N; i++)
if(Jud[i] == false){
cout << i << endl;
flag = true;
}
if(flag == false)
cout << 0 << endl;
}
int main()
{
ios::sync_with_stdio(false);
Inserts();
DFS(1);
Printout();
return 0;
}
- DFS+邻接表
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
#define maxx 250*250+100
#define pointsmax 300
struct POINTS{
int y, next;
}K[maxx];
int links[pointsmax];//起始点的第一个边的序号;
bool vis[pointsmax];
int ans = 0;
int N, M;
int a, b;
bool Jud[pointsmax];
inline void putin(int xx, int yy){
ans++;
K[ans].y = yy;
K[ans].next = links[xx];
links[xx] = ans;
}
void Inserts()
{
cin >> N >> M;
memset(K, 0, sizeof(K));
memset(links, 0, sizeof(links));
memset(Jud, false, sizeof(Jud));
memset(vis, true, sizeof(vis));
for(int i = 1; i <= M; i++){
cin >> a >> b;
putin(a, b);
putin(b, a);
}
}
void BFS(int s)
{
for(int i = links[s]; i; i = K[i].next)
if(vis[K[i].y] == true){
vis[K[i].y] = false;
Jud[K[i].y] = true;
BFS(K[i].y);
}
}
void Printout()
{
bool flag = false;
for(int i = 2; i <= N; i++)
if(Jud[i] == false){
flag = true;
cout << i << endl;
}
if(!flag) cout << 0 << endl;
}
int main()
{
ios::sync_with_stdio(false);
Inserts();
BFS(1);
Printout();
return 0;
}