文章目录
注:前面几个题基本上是最后一个题改过来的,如有错误,欢迎指正
问题 A: 邻接矩阵存储的图,节点的出度和入度计算(附加代码模式)
#include <iostream>
#include <cstdio>
using namespace std;
#define MAX_SIZE 100
struct Graph{
int nodeNumber;
int adjMatrix[MAX_SIZE][MAX_SIZE];
};
// 计算每个节点的出度和入度
void CalculateDegree(const Graph& g, int inDegree[], int outDegree[]){
int n=g.nodeNumber;
for( int i=0;i<n;i++){
for( int j=0;j<n;j++){
if(g.adjMatrix[i][j]==0) continue;
inDegree[j]++;
outDegree[i]++;
}
}
}
please comment the following code when you submit to OJ
int main(){
// freopen("/config/workspace/answer/test.in","r",stdin);
Graph g;
cin >> g.nodeNumber;
int inDegree[g.nodeNumber] = {0}, outDegree[g.nodeNumber] = {0};
for(int i=0;i<g.nodeNumber;i++){
for(int j=0;j<g.nodeNumber;j++){
cin >> g.adjMatrix[i][j];
}
}
CalculateDegree(g, inDegree, outDegree);
for(int i=0;i<g.nodeNumber;i++){
cout << inDegree[i] << " " << outDegree[i] << endl;
}
return 0;
}
问题 B: 算法7-12:有向无环图的拓扑排序
#include <bits/stdc++.h>
using namespace std;
const int N = 1100;
struct p
{
int from, to, val;
} edge[N];
int w[N][N];
vector<int> ans;
int e[N], l[N], ve[N], vl[N];
int top_sort(int n)
{
int indeg[N] = {};
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
if (w[i][j] == 0)
continue;
indeg[j]++;
}
}
stack<int> Point;
for (int j = 0; j < n; j++)
{
if (indeg[j] == 0)
{
Point.push(j);
}
}
while (!Point.empty())
{
int ne = Point.top();
Point.pop();
ans.push_back(ne);
for (int j = 0; j < n; j++)
{
if (w[ne][j] != 0)
indeg[j]--;
else
continue;
if (indeg[j] == 0)
{
Point.push(j);
}
}
}
if (ans.size() != n)
return -1;
return 0;
}
int main()
{
int n;
cin >> n;
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
cin >> w[i][j];
}
}
if (top_sort(n) == -1)
{
cout << "ERROR" << endl;
}
else
{
for (int i = 0; i < ans.size(); i++)
{
cout << ans[i] << " ";
}
}
return 0;
}
问题 C: 有向图是否存在环?
#include <bits/stdc++.h>
using namespace std;
const int N = 1100;
struct p
{
int from, to, val;
} edge[N];
int w[N][N];
vector<int> ans;
int e[N], l[N], ve[N], vl[N];
int top_sort(int n)
{
int indeg[N] = {};
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= n; j++)
{
if (w[i][j] == 0)
continue;
indeg[j]++;
}
}
stack<int> Point;
for (int j = 1; j <= n; j++)
{
if (indeg[j] == 0)
{
Point.push(j);
}
}
while (!Point.empty())
{
int ne = Point.top();
Point.pop();
ans.push_back(ne);
for (int j = 1; j <= n; j++)
{
if (w[ne][j] != 0)
indeg[j]--;
else
continue;
if (indeg[j] == 0)
{
Point.push(j);
}
}
}
if (ans.size() != n)
return -1;
return 0;
}
int main()
{
int n, m;
while (cin >> n >> m)
{
if (n == 0 && m == 0)
break;
memset(w, 0, sizeof(w));
ans.clear();
for (int i = 0; i < m; i++)
{
int a, b;
cin >> a >> b;
w[a][b] = 1;
}
if (top_sort(n) == -1)
{
cout << "YES" << endl;
}
else
{
cout << "NO" << endl;
}
}
return 0;
}
问题 D: 图-节点的最早发生时间
#include <bits/stdc++.h>
using namespace std;
const int N = 110;
struct p
{
int from, to, val;
} edge[N];
int w[N][N];
vector<int> ans;
int e[N], l[N], ve[N], vl[N];
int top_sort(int n)
{
int indeg[N] = {};
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
if (w[i][j] == 0)
continue;
indeg[j]++;
}
}
stack<int> Point;
for (int j = 0; j < n; j++)
{
if (indeg[j] == 0)
{
Point.push(j);
}
}
while (!Point.empty())
{
int ne = Point.top();
Point.pop();
ans.push_back(ne);
for (int j = 0; j < n; j++)
{
if (w[ne][j] != 0)
indeg[j]--;
else
continue;
if (indeg[j] == 0)
{
Point.push(j);
}
}
}
if (ans.size() != n)
return -1;
return 0;
}
void cal(int n)
{
for (int i = 0; i < ans.size(); i++)
{
int now = ans[i];
for (int j = 0; j < n; j++)
{
if (w[now][j] == 0)
continue;
ve[j] = max(ve[now] + w[now][j], ve[j]);
}
}
for (int i = 0; i < ans.size(); i++)
{
vl[i] = ve[ans[ans.size() - 1]];
}
for (int i = ans.size() - 1; i >= 0; i--)
{
int now = ans[i];
for (int j = 0; j < n; j++)
{
if (w[now][j] == 0)
continue;
vl[now] = min(vl[j] - w[now][j], vl[now]);
}
}
return;
}
int main()
{
int n, m;
cin >> n >> m;
for (int i = 0; i < m; i++)
{
int a, b, c;
cin >> a >> b >> c;
w[a][b] = c;
edge[i].from = a;
edge[i].to = b;
edge[i].val = c;
}
top_sort(n);
cal(n);
for (int i = 0; i < n; i++)
{
cout << ve[i] << endl;
}
return 0;
}
问题 E: 图-节点的最迟发生时间
#include <bits/stdc++.h>
using namespace std;
const int N = 110;
struct p
{
int from, to, val;
} edge[N];
int w[N][N];
vector<int> ans;
int e[N], l[N], ve[N], vl[N];
int top_sort(int n)
{
int indeg[N] = {};
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
if (w[i][j] == 0)
continue;
indeg[j]++;
}
}
stack<int> Point;
for (int j = 0; j < n; j++)
{
if (indeg[j] == 0)
{
Point.push(j);
}
}
while (!Point.empty())
{
int ne = Point.top();
Point.pop();
ans.push_back(ne);
for (int j = 0; j < n; j++)
{
if (w[ne][j] != 0)
indeg[j]--;
else
continue;
if (indeg[j] == 0)
{
Point.push(j);
}
}
}
if (ans.size() != n)
return -1;
return 0;
}
void cal(int n)
{
for (int i = 0; i < ans.size(); i++)
{
int now = ans[i];
for (int j = 0; j < n; j++)
{
if (w[now][j] == 0)
continue;
ve[j] = max(ve[now] + w[now][j], ve[j]);
}
}
for (int i = 0; i < ans.size(); i++)
{
vl[i] = ve[ans[ans.size() - 1]];
}
for (int i = ans.size() - 1; i >= 0; i--)
{
int now = ans[i];
for (int j = 0; j < n; j++)
{
if (w[now][j] == 0)
continue;
vl[now] = min(vl[j] - w[now][j], vl[now]);
}
}
return;
}
int main()
{
int n, m;
cin >> n >> m;
for (int i = 0; i < m; i++)
{
int a, b, c;
cin >> a >> b >> c;
w[a][b] = c;
edge[i].from = a;
edge[i].to = b;
edge[i].val = c;
}
top_sort(n);
cal(n);
for (int i = 0; i < n; i++)
{
cout << vl[i] << endl;
}
return 0;
}
问题 F: 图-图的关键路径
#include <bits/stdc++.h>
using namespace std;
const int N = 110;
struct p
{
int from, to, val;
} edge[N];
int w[N][N];
vector<int> ans;
int e[N], l[N], ve[N], vl[N];
int top_sort(int n)
{
int indeg[N] = {};
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
if (w[i][j] == 0)
continue;
indeg[j]++;
}
}
stack<int> Point;
for (int j = 0; j < n; j++)
{
if (indeg[j] == 0)
{
Point.push(j);
}
}
while (!Point.empty())
{
int ne = Point.top();
Point.pop();
ans.push_back(ne);
for (int j = 0; j < n; j++)
{
if (w[ne][j] != 0)
indeg[j]--;
else
continue;
if (indeg[j] == 0)
{
Point.push(j);
}
}
}
if (ans.size() != n)
return -1;
return 0;
}
void cal(int n)
{
for (int i = 0; i < ans.size(); i++)
{
int now = ans[i];
for (int j = 0; j < n; j++)
{
if (w[now][j] == 0)
continue;
ve[j] = max(ve[now] + w[now][j], ve[j]);
}
}
for (int i = 0; i < ans.size(); i++)
{
vl[i] = ve[ans[ans.size() - 1]];
}
for (int i = ans.size() - 1; i >= 0; i--)
{
int now = ans[i];
for (int j = 0; j < n; j++)
{
if (w[now][j] == 0)
continue;
vl[now] = min(vl[j] - w[now][j], vl[now]);
}
}
return;
}
int main()
{
int n, m;
cin >> n >> m;
for (int i = 0; i < m; i++)
{
int a, b, c;
cin >> a >> b >> c;
w[a][b] = c;
edge[i].from = a;
edge[i].to = b;
edge[i].val = c;
}
top_sort(n);
cal(n);
for (int i = 0; i < m; i++)
{
e[i] = ve[edge[i].from];
l[i] = vl[edge[i].to] - w[edge[i].from][edge[i].to];
if (e[i] == l[i])
{
printf("%d-->%d:%d\n", edge[i].from, edge[i].to, e[i]);
}
}
return 0;
}