luogu P3144 [USACO16OPEN]关闭农场Closing the Farm_Silver解题报告

题目描述

Farmer John and his cows are planning to leave town for a long vacation, and so FJ wants to temporarily close down his farm to save money in the meantime.

The farm consists of NN barns connected with MM bidirectional paths between some pairs of barns (1 \leq N, M \leq 30001≤N,M≤3000). To shut the farm down, FJ plans to close one barn at a time. When a barn closes, all paths adjacent to that barn also close, and can no longer be used.

FJ is interested in knowing at each point in time (initially, and after each closing) whether his farm is "fully connected" -- meaning that it is possible to travel from any open barn to any other open barn along an appropriate series of paths. Since FJ‘s farm is initially in somewhat in a state of disrepair, it may not even start out fully connected.

FJ和他的奶牛们正在计划离开小镇做一次长的旅行,同时FJ想临时地关掉他的农场以节省一些金钱。

这个农场一共有被用M条双向道路连接的N个谷仓(1<=N,M<=3000)。为了关闭整个农场,FJ 计划每一次关闭掉一个谷仓。当一个谷仓被关闭了,所有的连接到这个谷仓的道路都会被关闭,而且再也不能够被使用。

FJ现在正感兴趣于知道在每一个时间(这里的“时间”指在每一次关闭谷仓之前的时间)时他的农场是否是“全连通的”——也就是说从任意的一个开着的谷仓开始,能够到达另外的一个谷仓。注意自从某一个时间之后,可能整个农场都开始不会是“全连通的”。

输入输出格式

输入格式:

The first line of input contains NN and MM. The next MM lines each describe a

path in terms of the pair of barns it connects (barns are conveniently numbered

1 \ldots N1…N). The final NN lines give a permutation of 1 \ldots N1…N

describing the order in which the barns will be closed.

输出格式:

The output consists of NN lines, each containing "YES" or "NO". The first line

indicates whether the initial farm is fully connected, and line i+1i+1 indicates

whether the farm is fully connected after the iith closing.

输入输出样例

输入样例#1:

4 3
1 2
2 3
3 4
3
4
1
2

输出样例#1:

YES
NO
YES
YES

这道题有一个判连通性过程,马上应该想到并查集这种好东西,但是我们从一个集合去拆肯定会很麻烦的,时间上也无法被允许,那么我们正难则反,既然正着推比较麻烦,那我们为什么不把这个关闭的过程倒过来想象成打开呢,刚开始都是关闭状态,然后一个个打开,最后倒着输出即可,不多说了上代码
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
int n,m,a[3005][3005],p[3005],check[3005],fa[3005],ans[3005];
int find(int x){
    if(fa[x]==x) return x;
    return fa[x]=find(fa[x]);
}
int main(){
    scanf("%d%d",&n,&m);
    for(int i=1;i<=m;i++){
        int x,y;
        scanf("%d%d",&x,&y);
        a[x][y]=a[y][x]=1;
    }
    for(int i=1;i<=n;i++){
        fa[i]=i;
        scanf("%d",&p[i]);
    }
    for(int i=n;i>=1;i--){
        check[p[i]]=1;
        for(int j=1;j<=n;j++)
            if(check[j]&&a[p[i]][j]){
                //if(i==2) printf("%d %d\n",p[i],j);
                fa[find(p[i])]=find(j);
            }
        int cnt=0;
        for(int j=1;j<=n;j++)
            if(check[j]&&fa[j]==j) cnt++;
        if(cnt>1) ans[i]=1;
    }
    for(int i=1;i<=n;i++)
        if(ans[i]) printf("NO\n");
        else printf("YES\n");
    return 0;
}

原文地址:https://www.cnblogs.com/NGUalexzhang/p/9732596.html

时间: 2024-10-27 06:51:47

luogu P3144 [USACO16OPEN]关闭农场Closing the Farm_Silver解题报告的相关文章

洛谷P3144 [USACO16OPEN]关闭农场Closing the Farm_Silver

题目描述 Farmer John and his cows are planning to leave town for a long vacation, and so FJ wants to temporarily close down his farm to save money in the meantime. The farm consists of NN barns connected with MM bidirectional paths between some pairs of

P3144 [USACO16OPEN]关闭农场Closing the Farm_Silver(并查集反向)

题目描述 Farmer John and his cows are planning to leave town for a long vacation, and so FJ wants to temporarily close down his farm to save money in the meantime. The farm consists of NNN barns connected with MMM bidirectional paths between some pairs o

洛谷 P3144 [USACO16OPEN]关闭农场Closing the Farm_Silver

传送门 题目大意: n个谷仓 ,每次关闭一个谷仓,问剩下没被关闭的谷仓是 否联通. 题解:并查集+倒序处理 代码: #include<iostream> #include<cstdio> #include<cstring> #define N 3030 using namespace std; int n,m,sumedge,cnt; int head[N],fa[N],q[N],ans[N],exit[N]; struct Edge{ int x,y,nxt; Edg

洛谷P3144 [USACO16OPEN]关闭农场Closing the Farm

题目描述 Farmer John and his cows are planning to leave town for a long vacation, and so FJ wants to temporarily close down his farm to save money in the meantime. The farm consists of  barns connected with  bidirectional paths between some pairs of barn

[USACO16OPEN]关闭农场Closing the Farm_Silver

题目描述 Farmer John and his cows are planning to leave town for a long vacation, and so FJ wants to temporarily close down his farm to save money in the meantime. The farm consists of NNN barns connected with MMM bidirectional paths between some pairs o

[USACO16OPEN]关闭农场Closing the Farm(洛谷 3144)

题目描述 Farmer John and his cows are planning to leave town for a long vacation, and so FJ wants to temporarily close down his farm to save money in the meantime. The farm consists of  barns connected with  bidirectional paths between some pairs of barn

P3144 关闭农场 并查集 反向

FJ和他的奶牛们正在计划离开小镇做一次长的旅行,同时FJ想临时地关掉他的农场以节省一些金钱. 这个农场一共有被用M条双向道路连接的N个谷仓(1<=N,M<=3000).为了关闭整个农场,FJ 计划每一次关闭掉一个谷仓.当一个谷仓被关闭了,所有的连接到这个谷仓的道路都会被关闭,而且再也不能够被使用. FJ现在正感兴趣于知道在每一个时间(这里的“时间”指在每一次关闭谷仓之前的时间)时他的农场是否是“全连通的”——也就是说从任意的一个开着的谷仓开始,能够到达另外的一个谷仓.注意自从某一个时间之后,可

luogu P3147 [USACO16OPEN]262144

题目描述 Bessie likes downloading games to play on her cell phone, even though she doesfind the small touch screen rather cumbersome to use with her large hooves. She is particularly intrigued by the current game she is playing.The game starts with a seq

luogu P3146 [USACO16OPEN]248

基础区间的dp题 状态很容易得出:dp[i][j]表示区间i--j可以合成的最大数. 状态转移方程很显然:if (dp[i][k]==dp[k+1][j]) dp[i][j]=max(dp[i][j],dp[i][k]+1) 那么只需要先枚举结点,在以该结点为中心向两边枚举长度即可,但一次循环不能保证所有数据都正确,因为后得出的区间可能更新前得出的区间. 为了解决问题,跑多次循环 #include<iostream> #include<cstdio> #include<cma