for(int j=0;j<mxn;j++) { minm=inf; for(int i=0;i<mxn;i++) { if(mp[s][i]!=inf) dis[i]=min(dis[i],mp[s][i]+dis[s]); if(!vis[i]&&minm>=dis[i]) minm=dis[i],target=i; } vis[target]=1;s=target; }这个循环中第二个if的作用
时间: 2024-04-20 21:23:53 浏览: 55
第二个 if 语句的作用是在每次迭代中找到当前未访问过的节点中距离起始节点(s)最近的节点,并将其赋值给变量 target。这样做的目的是确保每次更新最短路径时,选择的下一个节点是当前未访问过的节点中距离起始节点最近的节点。这个循环与你之前提到的循环相似,都是用来实现 Dijkstra 算法来求解最短路径问题。
相关问题
#include <bits/stdc++.h> using namespace std; const int mxn=3e1+5; unordered_map<string,int>mp; int n,m; char s[1000],t[1000]; double x,dis[mxn][mxn]; void floyd() { for(int k=0;k<n;k++) for(int i=0;i<n;i++) { if(dis[i][k]==0) continue; for(int j=0;j<n;j++) dis[i][j]=max(dis[i][j],dis[i][k]*dis[j][k]); } } int main() { int cnt=0; while(scanf("%d",&n)==1) { if(n==0) break; for(int i=0;i<mxn;i++) for(int j=0;j<mxn;j++) dis[i][j]=i==j; mp.clear(); for(int i=1;i<=n;i++) { scanf("%s",s); mp[s]=mp.size(); } scanf("%d",&m); for(int i=i;i<=m;i++) { scanf("%s%lf%s",s,&x,t); if(mp.count(s)==0||mp.count(t)==0) continue; dis[mp[s]][mp[t]]=x; } floyd(); int sum=0; for(int i=0;i<n;i++) sum|=dis[i][i]>1; printf("Case %d: %s\n", ++cnt, sum?"Yes":"No"); } return 0; }这个代码为什么n只读取一次
这段代码中的`while(scanf("%d",&n)==1)`是一个循环条件,只有当读取到一个整数并且成功赋值给变量n时,循环才会执行。在这里,`scanf("%d",&n)`语句只会读取一次n的值,并且在每次循环开始时检查是否成功赋值。如果输入的值不是整数或者无法成功赋值给n,循环将终止。这样做是为了确保输入的n值正确,并且在输入结束时能够正确地退出循环。
#include <iostream> #include <algorithm> #include <cstring> using namespace std; const int mxn=1e6+5; int s[mxn], n, m, a[mxn], sum=0, v[mxn]; int check(int x) { if(x!=s[x]) return check(s[x]); return s[x]; } int main() { scanf("%d", &n); memset(v,0,sizeof v); for(int i=1;i<=n;i++) s[i]=i;//初始化 for(int i=1;i<=n;i++){ scanf("%d", &m); if(m==-1){ sum++; v[i]=1; //标记父结点 a[i]++; } else s[i]=check(m); } printf("%d\n", sum); for(int i=1;i<=n;i++){ if(i!=s[i]){//不属于父结点 s[i]=check(s[i]); a[s[i]]++; } } for(int i=1;i<=n;i++){ if(v[i]) printf("%d %d\n", i, a[i]); } return 0; } 中三个数组的作用是什么
这段代码中的三个数组的作用如下:
1. `s[mxn]` 数组:用于存储每个节点的父节点,用于实现并查集(Union-Find)的功能。在初始化时,每个节点的父节点都是自己。
2. `a[mxn]` 数组:用于记录每个父节点下的子节点数量。对于每个节点,如果其父节点为-1,则将其标记为父节点,并将其对应的 `a` 值加1。
3. `v[mxn]` 数组:用于标记父节点。当输入的节点值为-1时,表示此节点为父节点,将其对应的 `v` 值设置为1,方便后续输出。
总结起来,`s` 数组实现了并查集的功能,`a` 数组记录了每个父节点的子节点数量,`v` 数组标记了父节点。
阅读全文