P1119
题目:https://www.luogu.com.cn/problem/P1119
#include<bits/stdc++.h>
using namespace std;
const int maxn = 300;
int n,m;
int a[maxn];
int G[maxn][maxn];
void Floyd(int k){
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(G[i][j]>G[i][k]+G[k][j]){
G[i][j] = G[i][k]+G[k][j];
}
}
}
return;
}
int main(){
scanf("%d %d",&n,&m);
for(int i =0;i<n;i++){
scanf("%d",&a[i]);
}
for(int i =0;i<n;i++){
for(int j=0;j<n;j++){
if(j==i) G[i][j] = 0;
else G[i][j] = 1e9;//初始化不可达
}
}
int u,v,w;
for(int i=0;i<m;i++){
scanf("%d %d %d",&u,&v,&w);
G[u][v] = G[v][u] = w;//双向
}
int q;
scanf("%d",&q);//询问数
int t;
int index =0;
for(int i =0;i<q;i++){
scanf("%d %d %d",&u,&v,&t);
while(a[index]<=t && index<n){
Floyd(index);//用index号村庄进行更新距离
index++;
}
if(a[u]>t ||a[v]>t) printf("-1\n");
else{
if(G[u][v]==1e9) printf("-1\n");
else printf("%d\n",G[u][v]);
}
}
return 0;
}
P3371 单源最短路径
#include<bits/stdc++.h>
using namespace std;
const int maxn = 100010;
const int INF = 1e10;
struct node{
int v,w;
node(int vv,int ww){
v=vv;
w=ww;
}
};
int n,m,s;
int dis[maxn];
vector<node> adj[maxn];
bool vis[maxn] = {false};
int num[maxn];//入队次数
void SPFA(){
memset(vis,0,sizeof(vis));
fill(dis,dis+maxn,INF);
memset(num,0,sizeof(num));
queue<int> q;
q.push(s);
vis[s] = true;
num[s]++;
dis[s] = 0;
while(!q.empty()){
int u = q.front();
q.pop();
vis[u]=false;//出队
for(int j = 0;j<adj[u].size();j++){
int v = adj[u][j].v;
int d = adj[u][j].w;
if(dis[u]+d<dis[v]){
dis[v] = dis[u]+d;
if(vis[v]==false){
q.push(v);
vis[v]=true;//入队
num[v]++;
if(num[v]>=n) return;
}
}
}
}
return;
}
int main(){
scanf("%d%d%d",&n,&m,&s);
int u,v,w;
for(int i =0;i<m;i++){
scanf("%d%d%d",&u,&v,&w);
adj[u].push_back(node(v,w));
}
SPFA();
for(int i =1;i<=n;i++){
if(i != n)
printf("%d ",dis[i]);
else
printf("%d\n",dis[i]);
}
return 0;
}
使用Dijkstra的邻接表表示
struct node{
int v,dis;//目标点和边权
node(int vv,int d){
v = vv;
dis = d;
}
};
int n,m,s;//n个点 m条边 起点s
vector<node> G[maxn];
int ds[maxn];
bool vis[maxn] = {false};//标记数组
//priority_queue<node> q;
void dijkstra(){
fill(ds,ds+maxn,INF);
ds[s] = 0;
for(int i =0;i<n;i++){
int u =-1,MIN=INF;
for(int j=0;j<n;j++){
if(vis[j]==false&&ds[j]<MIN){
u = j;
MIN=ds[j];
}
}
if(u==-1) return;
vis[u]= true;
for(int j =0;j<G[u].size();j++){
int v = G[u][j].v;
if(vis[v]==false&&G[u][j].dis+ds[u]<ds[v]){
ds[v] = G[u][j].dis+ds[u];
}
}
}
}
int main(){
scanf("%d %d %d",&n,&m,&s);
int u,v,w;
for(int i =0;i<m;i++){
scanf("%d %d %d",&u,&v,&w);
G[u].push_back(node(v,w));
}
dijkstra();
for(int i =1;i<=n;i++){
if(i != n)
printf("%d ",ds[i]);
else
printf("%d\n",ds[i]);
}
return 0;
}