当前位置: 首页 > news >正文

最短路与拓扑(2)

1、信使

#include<bits/stdc++.h>
using namespace std;
const int N=105;
int n,m;
int g[N][N];
int dist[N];
bool st[N];
const int INF=0x3f3f3f3f;int dij(){memset(dist,0x3f,sizeof dist);dist[1]=0;for(int i=1;i<n;i++){int t=0;for(int j=1;j<=n;j++){if(!st[j]&&dist[j]<dist[t]){t=j;}}st[t]=true;for(int k=1;k<=n;k++){dist[k]=min(dist[k],dist[t]+g[t][k]);}}int res=0;for(int i=1;i<=n;i++){if(dist[i]==INF) return -1;res=max(res,dist[i]);}return res;
}int main(){cin>>n>>m;memset(g,0x3f,sizeof g);for(int i=1;i<=n;i++){g[i][i]=0;}for(int i=0;i<m;i++){int u,v,w;cin>>u>>v>>w;g[u][v]=min(g[u][v],w);g[v][u]=min(g[v][u],w);} cout<<dij()<<endl;return 0;
}

2、最小花费

#include<bits/stdc++.h>
using namespace std;
const int N=2005;
double g[N][N];
double dist[N];
bool st[N];
int n,m,A,B;
void dij(){memset(st, 0, sizeof st);st[N]={0.0};dist[A]=1.0;for(int i=1;i<=n;i++){int t=-1;for(int j=1;j<=n;j++){if(!st[j]&&(t==-1||dist[j]>dist[t])){t=j;}}if(t==0)continue;st[t]=true;for(int k=1;k<=n;k++){if(g[t][k]>0){dist[k]=max(dist[k],dist[t]*g[t][k]);}	}}
}
int main(){cin>>n>>m;for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){g[i][j]=0;}}for(int i=1;i<=n;i++){int u,v,w;cin>>u>>v>>w;double r=(100.0-w)/100.0;g[u][v]=max(g[u][v],r);g[v][u]=max(g[u][v],r);}cin>>A>>B;dij();cout<<fixed<<setprecision(8)<<100.0/dist[B]<<endl;return 0;
}

3、Dijkstra算法(模板)

#include<bits/stdc++.h>
using namespace std;
const int N=2505;
int g[N][N];
int dis[N];
bool vis[N];
int n, m, s, t;
const int INF=1e9+10;void dij(int start, int end) {// 初始化距离数组for(int i=1; i<=n; i++) {dis[i] = INF;vis[i] = false;}dis[start] = 0;for(int i=1; i<=n; i++) {int u = -1, min_dist = INF;// 寻找未访问节点中距离最小的节点for(int j=1; j<=n; j++) {if(!vis[j] && dis[j] < min_dist) {min_dist = dis[j];u = j;}}if(u == -1) break; // 所有可达节点都已处理vis[u] = true; // 标记节点为已访问// 更新邻接节点的距离for(int v=1; v<=n; v++) {if(!vis[v] && g[u][v] != INF && dis[u] + g[u][v] < dis[v]) {dis[v] = dis[u] + g[u][v];}}}
}int main() {cin >> n >> m >> s >> t;// 初始化邻接矩阵for(int i=1; i<=n; i++) {for(int j=1; j<=n; j++) {if(i == j) g[i][j] = 0;else g[i][j] = INF; // 无边的情况初始化为INF}}// 读取边for(int i=1; i<=m; i++) {int u, v, w;cin >> u >> v >> w;// 处理重边,取最小值g[u][v] = min(g[u][v], w);g[v][u] = min(g[v][u], w);}dij(s, t);cout << dis[t] << endl; // 输出最短路径return 0;
}

4、排列论文

#include<bits/stdc++.h>
using namespace std;
const int N=105;
vector<int>g[N];
int a[N];
int n,m;
int flag;
int topSort(){queue<int>q;for(int i=1;i<=n;i++){if(a[i]==0){q.push(i);}}int cnt=0;//记录拓扑排序的排点数flag=1;while(!q.empty()){int t=q.front();q.pop();cnt++;if(!q.empty())flag=2;for(int i=0;i<g[t].size();i++){int x=g[t][i];a[x]--;if(a[x]==0)q.push(x);}}if(cnt<n)flag=0;return flag; 
}
int main() {while(cin>>n>>m){for(int i=1;i<=n;i++){//初始化 g[i].clear();//每一个点清空 a[i]=0;}for(int i=1;i<=m;i++){int u,v;cin>>u>>v;a[v]++;//更新入度 g[u].push_back(v);}int ff=topSort();if(ff==0)cout<<"0\n";else if(ff==1)cout<<"1\n";else if(ff==2)cout<<"2\n";}return 0;
}

相关文章:

  • map格式可以接收返回 fastjson2格式的数据 而不需要显示的转换
  • 【THRMM】追踪情绪动态变化的多模态时间背景网络
  • PostgreSQL常用DML操作的锁类型归纳
  • FlashInfer - 介绍 LLM服务加速库 地基的一块石头
  • 通过宝塔配置HTTPS证书
  • Problem B: 统计数字次数
  • 智慧工地系统如何实现实时监控?
  • 跨域的几种方案
  • ESP32WIFI工具加透传
  • 配置Nginx解决http host头攻击漏洞【详细步骤】
  • 从零开始完成“大模型在牙科诊所青少年拉新系统中RAG与ReACT功能实现”的路线图
  • Oracle数据库中,WITH..AS 子句用法解析
  • vue-cli项目升级rsbuild,效率提升50%+
  • 高压差分探头CMRR性能评估方法及优化策略
  • 扩散模型推理加速:从DDIM到LCM-Lora的GPU显存优化策略
  • RPC协议及库介绍
  • 学习日志06 java
  • 公链开发及其配套设施:钱包与区块链浏览器
  • 二叉树——层序遍历
  • OpenSHMEM 介绍和使用指南
  • 商务部:中方敦促美方尽快停止232关税措施
  • 今年有望投产里程已近3000公里,高铁冲刺谁在“狂飙”?
  • 国际奥委会举办研讨会,聚焦如何杜绝操纵比赛
  • 沧州低空经济起飞:飞行汽车开启千亿赛道,通用机场布局文旅体验
  • 陕西省安康市汉阴县县长陈永乐已任汉阴县委书记
  • 日本前卫艺术先驱群展上海:当具体派相遇古树古宅