构造图
邻接矩阵
#include <iostream>
using namespace std;
#include<cstring>
void test_01() {
int G[6][6];
memset(G,0,sizeof(G));
int m;
cin >> m;
for(int i = 0; i < m ; i++) {
int a,b;
cin >> a>> b;
G[a][b] = 1;
}
for(int i = 1; i <= 5; i++) {
int sum = 0;
for(int j = 1; j <= 5; j++) {
if(G[i][j] == 1 && G[j][i] == 1) {
sum++;
}
}
cout<< i << "有" <<sum << "个真正的朋友" <<endl;
}
return;
}
邻接表
#include<vector>
void test_02() {
vector<int> G[11];
int m;
cin >>m;
for(int i = 0; i < m; i++) {
int a,b;
cin >> a >> b;
G[a].push_back(b);
G[b].push_back(a);
}
for(int i = 1; i <= 10; i++) {
cout << i <<" : ";
for(int j = 0; j < G[i].size(); j++) {
cout <<G[i][j] <<" ";
}
cout << endl;
}
return;
}
struct node_03 {
int v;
int w;
};
vector <node_03> G_03[11];
void insert1_03(int u,int v,int w) {
node_03 temp;
temp.v = v;
temp.w = w;
G_03[u].push_back(temp);
}
void insert2_03(int u,int v,int w) {
insert1_03(u,v,w);
insert1_03(v,u,w);
}
void input_03() {
int m;
cin >> m;
for(int i = 0; i < m; i++) {
int u,v,w;
cin >> u >> v >> w;
insert2_03(u,v,w);
}
}
void output_03() {
for(int i = 1; i <= 10; i++) {
for(int j = 0; j < G_03[i].size(); j++) {
cout << "(" << i << ", " << G_03[i][j].v << ", " << G_03[i][j].w << ")" <<endl;
}
}
}
void test_03() {
input_03();
output_03();
return;
}
#include<map>
int ids_04;
int G_04[500][500];
map<string , int> dict_04;
int find_04(string a) {
if(dict_04.find(a) == dict_04.end()) {
dict_04[a] = ++ids_04;
} else {
return dict_04[a];
}
}
void test_04() {
memset(G_04,0,sizeof(G_04));
int n;
cin >> n;
for(int i = 0; i < n; i++) {
string a,b;
cin >> a >> b;
int x = find_04(a);
int y = find_04(b);
G_04[x][y] = G_04[y][x] = 1;
}
return;
}
最短路径
dijkstra算法
const int N_06 = 1001;
const int M_06 = 10001;
struct edge_06 {
edge_06() {
}
edge_06(int _v , int _w,int _next) {
v = _v;
w = _w;
next = _next;
}
int v,w,next;
} e_06[2 * M_06];
int head_06[N_06];
int size_06;
void init_06() {
memset(head_06,-1,sizeof(head_06));
size_06 = 0;
}
void insert_06(int u,int v,int w) {
e_06[size_06] = edge_06(v,w,head_06[u]);
head_06[u] = size_06++;
}
void insert2_06(int u,int v,int w) {
insert_06(u,v,w);
insert_06(v,u,w);
}
int n_06,m_06;
int dis_06[N_06];
bool vis_06[N_06];
void dijkstra_06(int u) {
memset(vis_06,false,sizeof(vis_06));
memset(dis_06,0x3f,sizeof(dis_06)) ;
dis_06[u] = 0;
for(int i = 0; i < n_06; i++) {
int mind = 1000000000,minj = -1;
for(int j = 1; j <= n_06; j++) {
if(!vis_06[j] && dis_06[j] < mind) {
minj = j;
mind = dis_06[j];
}
}
if(minj == -1) {
return;
}
vis_06[minj] = true;
for(int j = head_06[minj]; ~j; j = e_06[j].next ) {
int v = e_06[j].v;
int w = e_06[j].w;
if( !vis_06[v] && dis_06[v] > dis_06[minj] + w) {
dis_06[v] = dis_06[minj] + w;
}
}
}
}
void test_06() {
init_06();
int u,v,w;
cin >> n_06 >> m_06;
while(m_06--) {
cin >> u >> v >> w;
insert2_06(u,v,w);
}
dijkstra_06(1);
cout << dis_06[n_06] << endl;
return;
}
SPFA算法
#include<queue>
#include<cstring>
const int N = 1e3 + 9;
const int M = 1e4 + 9;
const int inf = 0x3f3f3f3f;
struct edge {
int v,w,fail;
edge() {
}
edge(int _v , int _w,int _fail) {
v = _v;
w = _w;
fail = _fail;
}
} e[M << 1];
int head[N];
int len;
void init() {
memset(head,-1,sizeof(head));
len = 0;
}
void add(int u,int v,int w) {
e[len] = edge(v,w,head[u]);
head[u] = len++;
}
void add2(int u,int v,int w) {
add(u,v,w);
add(v,u,w);
}
int m,n;
int dis[N];
bool vis[N];
void spfa(int u) {
memset(vis,false,sizeof(vis));
vis[u] = true;
memset(dis,0x3f,sizeof(dis));
dis[u] = 0;
queue<int> q;
q.push(u);
while(!q.empty()) {
u = q.front();
q.pop();
vis[u] = false;
for(int j = head[u]; ~j; j = e[j].fail) {
int v = e[j].v;
int w = e[j].w;
if(dis[v] > dis[u] + w) {
dis[v] = dis[u] + w;
if(!vis[v]) {
q.push(v);
vis[v] = true;
}
}
}
}
}
void test_07() {
init();
int u,v,w;
cin >> n >> m;
while(m--) {
cin >> u >> v >> w;
add2(u,v,w);
}
spfa(1);
cout << dis[n] << endl;
return;
}
int main() {
test_07();
return 0;
}
多源最短路径 (Floyd 算法)
const int N = 101;
int g[N][N];
void floyd(int n) {
for(int k = 1;k <= n;k++) {
for(int i = 1;i <= n;i++) {
for(int j = 1;j <= n;j++) {
g[i][j] = min(g[i][j] , g[i][k] + g[k][j]);
}
}
}
}
void test_08() {
memset(g,0x3f,sizeof(g));
for(int i = 0; i < N; i++) {
g[i][i] = 0;
}
int n,m;
int u,v,w;
cin >> n >> m;
while(m--) {
cin >> u >> v >> w;
g[u][v] = g[v][u] = w;
}
floyd(n);
for(int i = 1;i <= n;i++){
for(int j = 1;j <= n;j++){
cout << g[i][j] << " ";
}
cout << endl;
}
return;
}
int main() {
test_08();
return 0;
}