由于oj给的代码过于长(每次都得补一大堆,而且要理解它给的函数的意思,懒),所以就借助一些大佬的想法与自己的再次创作写了下面的图的创建,dfs与bfs,大家可以参考一下(注:用到一些STL)算法的思想我相信各位都是会的那就不注释了(其实是我懒 )
#include<stack>
#include<math.h>
#include<iostream>
#include<cstring>
#include<string>
using namespace std;
#define IOS ios::sync_with_stdio(0),cin.tie(0)
#include<algorithm>
#include<queue>
typedef long long ll;
//有向图:0,有向网:1,无向图:2,无向网:3
void dfs(int x, stack<int>* list, int v[], string s[]) {
if (v[x] == 1)return;//访问过,返回
cout << s[x] << ' ';
v[x] = 1;
int len = list[x].size();
for (int i = 0; i < len; i++) {
int t = list[x].top();
list[x].pop();
if (v[t] == 0)dfs(t, list, v, s);
}
}
void bfs(int x, stack<int>* list, int v[], string s[]) {
if (v[x] == 0)
{
cout << s[x] << ' ';
v[x] = 1;
queue<int>q;
q.push(x);
while (!q.empty()) {
int u = q.front(), w;
q.pop();
while (!list[u].empty()) {
w = list[u].top();
list[u].pop();
if (v[w] == 0) {
cout << s[w] << ' ';
v[w] = 1;
}
}
}
}
}
int main()
{
int v[20] = { 0 };//标记数组
int type;
string x, y;
int w;//权值
cin >> type;
int n, m;//顶点,边数
cin >> n >> m;
string* s = new string[n + 1]{ "" };//存所有顶点,下标为对应编号
stack<int>list[21];//充当邻接表
for (int i = 1; i <= n; i++) {//输入顶点名称
cin >> s[i];
}
for (int i = 1; i <= m; i++) {
x = y = "";
if (type == 1 || type == 3)cin >> x >> y >> w;//为网的时候需要加上权值
else cin >> x >> y;
int p = -1, q = -1;//弧头弧尾的下标
for (int j = 1; j <= n; j++) {
if (x == s[j])p = j;
else if (y == s[j])q = j;
if (p != -1 && q != -1)break;//找到就退出
}
if (type == 0 || type == 1)//如果有向
list[p].push(q);
else {
list[p].push(q);
list[q].push(p);
}
}
//dfs
//for (int i = 1; i <= n; i++)dfs(i, list, v, s);
for (int i = 1; i <= n; i++)bfs(i, list, v, s);
}
emm复习时发现代码可以更简单点,并且发现oj的样例有点水额咳咳
改进版
#include <iostream>
#include<algorithm>
#include<math.h>
typedef long long ll;
#define IOS ios::sync_with_stdio(false),cin.tie(0)
#include<iostream>
using namespace std;
#include<cstring>
#include<queue>
#include<stack>
#include<string>
#include<vector>
#include<list>
stack<int>s[105];
int v, e;//顶点数和边数
int type;//(有向图:0,有向网:1,无向图:2,无向网:3);
string str[105] = { "" };
int visit[105];
void dfs(int x) {
if (visit[x] == 0) {
visit[x] = 1;
cout << str[x] << ' ';
int cur = s[x].top();
s[x].pop();
dfs(cur);
}
}
void bfs() {
visit[0] = 1;
cout << str[0] << ' ';
int k = 0;
for (int i = 0; i < v; i++) {
while (!s[i].empty()) {
int cur = s[i].top();
s[i].pop();
if (visit[cur] == 0) {
visit[cur] = 1;
cout << str[cur] << ' ';
}
}
}
}
int main()
{
IOS;
cin >> type;
cin >> v >> e;
for (int i = 0; i < v; i++)cin >> str[i];
string t, f;
int w = 0;
for (int i = 0; i < e; i++) {
if (type == 0 || type == 2)
{
cin >> t >> f;
int tpos=0, fpos=0;
for (int j = 0; j < v; j++) {
if (t == str[j])tpos = j;
else if (f == str[j])fpos = j;
}
s[tpos].push(fpos);
if (type == 2) s[fpos].push(tpos);
}
else {
cin >> t >> f >> w;
int tpos, fpos;
for (int j = 0; j < v; j++) {
if (t == str[j])tpos = j;
else if (f == str[j])fpos = j;
}
s[tpos].push(fpos);
if (type == 3) s[fpos].push(tpos);
}
}
//bfs();
//cout << endl;
for (int i = 0; i < v; i++)dfs(i);
}