DFS与匈牙利算法,JAVA注意事项

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;
}

猜你喜欢

转载自blog.csdn.net/qq_45673816/article/details/114338838