2021牛客寒假算法基础集训营5 A
Dfs相邻的最小的最大值
https://ac.nowcoder.com/acm/contest/9985/A
注意:一个点被Dfs过,只代表他不被第二次DFS不代表他不更新值
#include <bits/stdc++.h>
using namespace std;
const int Mn = 2e5 + 5;
vector <int> son[Mn];
#define ll long long
int vis[Mn];
ll ans = 0,node[Mn];
void Dfs(int a,int fa){
ans = max(ans,min(node[a],node[fa]));
vis[a] = 1;
for(int it : son[a]){
ans = max(ans,min(node[it],node[a]));//这里的it
//虽然不参与DFS但是参与答案贡献
if(vis[it]) continue;
Dfs(it,a);
}
}
inline void Slove(){
int n,m,s,t;scanf("%d%d%d%d",&n,&m,&s,&t);
memset(vis,0,sizeof(vis));for(int i = 1;i <= n;i ++) son[i].clear();ans = 0;
for(int i = 1;i <= n;i ++) scanf("%lld",node + i);
int a,b;
for(int i = 1;i <= m;i ++){
scanf("%d%d",&a,&b);son[a].push_back(b);son[b].push_back(a);
}
Dfs(s,s);
if(vis[t]) printf("YES\n%lld\n",ans);
else printf("NO\n");
}
int main(){
int _;scanf("%d",&_);while(_--)Slove();
return 0;
}
JAVA
字符读入next和nextline和%c一样,在读入整数之后的空格需要用一个nextline去掉
匈牙利算法
注意回找的时候是
f
o
r
g
e
t
(
m
a
t
e
[
i
t
]
,
k
)
forget(mate[it],k)
forget(mate[it],k)不是
f
o
r
g
e
t
(
i
t
,
k
)
forget(it,k)
forget(it,k)
https://www.luogu.com.cn/problem/P2055
另外需要想清楚左右侧元素各代表什么
#include <bits/stdc++.h>
using namespace std;
const int Mn = 2e5 + 5;
vector <int> son[Mn];
#define ll long long
int vis[Mn];
ll ans = 0,node[Mn];
void Dfs(int a,int fa){
ans = max(ans,min(node[a],node[fa]));
vis[a] = 1;
for(int it : son[a]){
ans = max(ans,min(node[it],node[a]));
if(vis[it]) continue;
Dfs(it,a);
}
}
inline void Slove(){
int n,m,s,t;scanf("%d%d%d%d",&n,&m,&s,&t);
memset(vis,0,sizeof(vis));for(int i = 1;i <= n;i ++) son[i].clear();ans = 0;
for(int i = 1;i <= n;i ++) scanf("%lld",node + i);
int a,b;
for(int i = 1;i <= m;i ++){
scanf("%d%d",&a,&b);
son[a].push_back(b);
son[b].push_back(a);
}
Dfs(s,s);
if(vis[t]) printf("YES\n%lld\n",ans);
else printf("NO\n");
}
int main(){
int _;scanf("%d",&_);while(_--)Slove();
return 0;
}