B3647 【模板】Floyd
#include <stdio.h>
#define inf 0x3f3f3f3f
int map[1000][1000];
int main()
{
int k,i,j,n,m;
scanf("%d%d",&n,&m);
for(i=1; i<=n; i++)
for(j=1; j<=n; j++)
if(i==j)
map[i][j]=0;
else
map[i][j]=inf;
int a,b,c;
for(i=1; i<=m; i++)
{
scanf("%d%d%d",&a,&b,&c);
map[a][b]=c;
map[b][a]=c;
}
for(k=1; k<=n; k++)
for(i=1; i<=n; i++)
for(j=1; j<=n; j++)
if(map[i][j]>map[i][k]+map[k][j] )
map[i][j]=map[i][k]+map[k][j];
for(i=1; i<=n; i++)
{
for(j=1; j<=n; j++)
{
printf("%d ",map[i][j]);
}
printf("\n");
}
return 0;
}
P4779 【模板】单源最短路径(标准版)
#include <bits/stdc++.h>
using namespace std;
const int N = 100005;
const int M = 200005;
struct edge {
int v;
int w;
int next;
} e[M];
int n, m, s, cnt;
int head[N], vis[N], dis[N];
struct node {
int id;
int w;
const bool operator < (const node&a) const{
return a.w < w;
}
};
inline void read(int &x) {
char ch = getchar(); x = 0;
for (; !isdigit(ch); ch = getchar()) ;
for (; isdigit(ch); ch = getchar()) x = x * 10 + ch - 48;
}
void add(int u, int v, int w) {
cnt++;
e[cnt].v = v;
e[cnt].w = w;
e[cnt].next = head[u];
head[u] = cnt;
}
priority_queue <node> q;
void Dijkstra(int s) {
for (int i = 1; i <= n; i++)
dis[i] = 1e9 + 1;
dis[s] = 0;
q.push((node){s, 0});
while (!q.empty()) {
node fro = q.top();
q.pop();
if (vis[fro.id]) continue;
vis[fro.id] = 1;
for (int i = head[fro.id]; i != -1; i = e[i].next) {
int nv = e[i].v;
if (dis[nv] > dis[fro.id] + e[i].w) {
dis[nv] = dis[fro.id] + e[i].w;
q.push((node){nv, dis[nv]});
}
}
}
return ;
}
int main() {
read(n), read(m), read(s);
memset(head, -1, sizeof(head));
for (int u, v, w, i = 0; i < m; i++) {
read(u), read(v), read(w);
add(u, v, w);
}
Dijkstra(s);
for (int i = 1; i <= n; i++)
printf ("%d ", dis[i]);
puts("");
return 0;
}
P2661 [NOIP2015 提高组] 信息传递
#include <iostream>
#include <vector>
#include <cstring>
using namespace std;
#define MAXN 200005
#define INF 0x7FFFFFFF
struct Edges
{
int u, v, id;
};
struct Node
{
int indegree, outdegree;
};
Node V[MAXN];
int v, ans;
vector<Edges> G[MAXN];
bool vis[MAXN];
void DFS(int v, int cnt)
{
unsigned int i;
if (vis[v])
{
ans = min(ans, cnt);
return;
}
vis[v] = true;
for (i = 0; i < G[v].size(); i++)
DFS(G[v][i].v, cnt + 1);
}
int main()
{
int i, x;
memset(V, 0, sizeof(V));
memset(vis, 0, sizeof(vis));
cin >> v;
for (i = 1; i <= v; i++)
{
cin >> x;
G[i].push_back((Edges){i, x, i});
V[i].outdegree++;
V[x].indegree++;
}
for (i = 1; i <= v; i++)
{
x = i;
while (!V[x].indegree && !vis[x])
{
vis[x] = true;
x = G[x][0].v;
V[x].indegree--;
}
}
ans = INF;
for (i = 1; i <= v; i++)
if (!vis[i])
DFS(i, 0);
cout << ans << endl;
return 0;
}
P1144 最短路计数
#include <iostream>
#include <cstring>
#include <vector>
#include <queue>
using namespace std;
const int maxn = 1e6+5, maxm = 2e6+5;
const int mod = 100003;
vector<int> g[maxn];
int dist[maxn];
bool vis[maxn];
int cnt[maxn];
int n, m;
void bfs(){
memset(dist, 0x3f3f3f3f,sizeof(dist));
memset(vis, false, sizeof(vis));
queue<int> q;
dist[1] = 0;
cnt[1] = 1;
q.push(1);
while(q.size()){
int u = q.front(); q.pop();
if(vis[u]) continue;
vis[u] = true;
for(int v : g[u]){
if(!vis[v]){
if(dist[v] > dist[u] + 1){
dist[v] = dist[u] + 1;
cnt[v]=cnt[u];
cnt[v] %= mod;
q.push(v);
}
else if(dist[v] == dist[u] + 1){
cnt[v] += cnt[u];
cnt[v] %= mod;
}
}
}
}
}
int main(){
cin >> n >> m;
for(int i=0; i<m; i++){
int a, b;
cin >> a >> b;
g[a].push_back(b);
g[b].push_back(a);
}
bfs();
for(int i=1; i<=n; i++){
cout << cnt[i] << endl;
}
return 0;
}
P8794 [蓝桥杯 2022 国 A] 环境治理
#include <bits/stdc++.h>
#define lowbit(x) x & (-x)
#define endl "\n"
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
namespace fastIO {
inline int read() {
register int x = 0, f = 1;
register char c = getchar();
while (c < '0' || c > '9') {
if(c == '-') f = -1;
c = getchar();
}
while (c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
return x * f;
}
inline void write(int x) {
if(x < 0) putchar('-'), x = -x;
if(x > 9) write(x / 10);
putchar(x % 10 + '0');
return;
}
}
using namespace fastIO;
int w[105][105];
int ww[105][105];
int minn[105][105];
int n, q;
int check(int day) {
int ans = 0;
for(int i = 0; i < n; i ++) {
for(int j = 0; j < n; j ++) {
ww[i][j] = w[i][j];
}
}
for(int i = 0; i < n; i ++) {
int val = day / n + (day % n >= i + 1 ? 1 : 0);
for(int j = 0; j < n; j ++) {
ww[i][j] -= val, ww[j][i] -= val;
}
}
for(int i = 0; i < n; i ++) {
for (int j = 0; j < n; j ++) {
ww[i][j] = max(minn[i][j], ww[i][j]);
}
}
for(int k = 0; k < n; k ++) {
for (int i = 0; i < n; i ++) {
for (int j = 0; j < n; j ++) {
ww[i][j] = min(ww[i][j], ww[i][k] + ww[k][j]);
}
}
}
for(int i = 0; i < n; i ++) {
for(int j = 0; j < n; j ++) {
ans += ww[i][j];
}
}
return ans;
}
int main() {
n = read(), q = read();
for(int i = 0; i < n; i ++) {
for(int j = 0; j < n; j ++) {
w[i][j] = read();
}
}
for(int i = 0; i < n; i ++) {
for(int j = 0; j < n; j ++) {
minn[i][j] = read();
}
}
int l = 0, r = 100000 * n, ans = -1;
while(l <= r) {
int mid = l + r >> 1;
if(check(mid) <= q) {
r = mid - 1;
ans = mid;
}
else {
l = mid + 1;
}
}
write(ans);
return 0;
}