畅通工程续
模板题
算法学习以及模板来自qscqesze的视频。
Spfa算法代码:
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 205;
const int INF = 1e9;
vector <pair <int, int> > E[MAXN];
int n, m;
int dis[MAXN], inq[MAXN];
void Init(){
for(int i = 0; i < MAXN; i++)
E[i].clear();
for(int i = 0; i < MAXN; i++)
inq[i] = 0;
for(int i = 0; i < MAXN; i++)
dis[i] = INF;
}
int main(){
while(~scanf("%d %d", &n, &m)){
Init();
for(int i = 0; i < m; i++){
int x, y, z;
scanf("%d%d%d", &x, &y ,&z);
E[x].push_back(make_pair(y, z));
E[y].push_back(make_pair(x, z));
}
int s, t;
scanf("%d %d", &s, &t);
queue <int> Q;
Q.push(s);
dis[s] = 0;
inq[s] = 1;
while(!Q.empty()){
int now = Q.front();
Q.pop();
inq[now] = 0;
for(int i = 0;i < E[now].size(); i++){
int v = E[now][i].first;
if(dis[v] > dis[now] + E[now][i].second){
dis[v] = dis[now] + E[now][i].second;
if(inq[v] == 1)
continue;
else
inq[v] = 1;
Q.push(v);
}
}
}
if(dis[t] == INF)
printf("-1\n");
else
printf("%d\n", dis[t]);
}
return 0;
}
Dijkstra算法代码:
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 205;
const int INF = 1e9;
vector <pair <int, int> > E[MAXN];
int n, m;
int dis[MAXN];
void Init(){
for(int i = 0; i < MAXN; i++)
E[i].clear();
for(int i = 0; i < MAXN; i++)
dis[i] = INF;
}
int main(){
while(~scanf("%d %d", &n, &m)){
Init();
for(int i = 0; i < m; i++){
int x, y, z;
scanf("%d%d%d", &x, &y ,&z);
E[x].push_back(make_pair(y, z));
E[y].push_back(make_pair(x, z));
}
int s, t;
scanf("%d %d", &s, &t);
priority_queue <pair <int, int> > Q;
dis[s] = 0;
Q.push(make_pair(-dis[s], s));
while(!Q.empty()){
int now = Q.top().second;
Q.pop();
for(int i = 0;i < E[now].size(); i++){
int v = E[now][i].first;
if(dis[v] > dis[now] + E[now][i].second){
dis[v] = dis[now] + E[now][i].second;
Q.push(make_pair(-dis[v], v));
}
}
}
if(dis[t] == INF)
printf("-1\n");
else
printf("%d\n", dis[t]);
}
return 0;
}
Floyd算法代码:
#include <cstdio>
#include <algorithm>
using namespace std;
const int MAXN = 205;
const int INF = 1e9+7;
int n, m;
int mp[MAXN][MAXN];
int main(){
while(~scanf("%d %d", &n, &m)){
for(int i = 0; i <n; i++){
for(int j = 0; j < n; j++){
if(i == j)
mp[i][j] = 0;
else
mp[i][j] = INF;
}
}
for(int i = 1; i <= m; i++){
int x, y, z;
scanf("%d %d %d", &x, &y, &z);
mp[x][y] = min(z, mp[x][y]);
mp[y][x] = min(z, mp[y][x]);
}
for(int k = 0; k < n; k++){
for(int i = 0; i < n; i++){
for(int j = 0; j < n; j++){
mp[i][j] = min(mp[i][j], mp[i][k] + mp[k][j]);
}
}
}
int s, t;
scanf("%d %d", &s, &t);
if(mp[s][t] == INF)
printf("-1\n");
else
printf("%d\n", mp[s][t]);
}
return 0;
}