【题解】【总结】P1330封锁阳关大学&&图论小总结

【题解】【总结】P1330 封锁阳光大学 &&图论小总结

这道题其实有一点点难度,不过我能经过思考做出来说明还是没有普及组\(D1T1\)难度的。

考虑一条边的两边要有且仅有一个点被选中...这不就是染色吗?想到此,聪明的你一定就知道怎么做了。

这题唯一的坑点就是不一定图是联通的,所以要\(for\)一下所有点去\(bfs\)。

这种题我还\(wa\)了一次,而且如果不是我下了数据还调不出来...

思考一下为什么没有一遍过此题,还是因为思维不够完善。图论的题目,有什么坑点呢?在这里总结一下:

  • 图不联通。有这个图的连通性意识就不会被坑。这里包括了森林的情况。
  • 有自环的重边。这个是毒瘤出题人干的事情,不能被坑了。
  • 存在负环,要判断一下。
  • 树的根被指定了!
  • 边数可能比你想像的要多。
  • \(spfa\)已经死了QAQ!
  • \(fr\)和\(to\)的位置调换了。凉心出题人!

解决图论的问题,可以通过什么办法呢?

  • \(Tarjin\)求环求强连通分量。
  • 最短路算法。(还有那种取对数的)
  • 缩点+\(DAG\) \(DP\)
  • 拓扑排序
  • 并查集
  • 最小生成树,实际上和拟阵联系起来。
  • 树形\(dp\),实际上和上面那个很像的
  • 树上倍增。\(lca\),\(st\)表啊之类的。
  • 树上差分。我也不是很熟。
  • 点分治。解决树上路径计数问题等。
  • 树链剖分。同样也是树上路径,还可以顺便解决子树等问题。
  • 树上莫队。神奇的算法。
  • 正难则反!图论的题维护加边比较容易,维护减边就比较麻烦。反着来!
  • 网络流。(主要是建模难 QAQ)

---cpp

include<bits/stdc++.h>

using namespace std;

define RP(t,a,b) for(register int t=(a),edd=(b);t<=edd;++t)

define DRP(t,a,b) for(register int t=(a),edd=(b);t>=edd;--t)

define ERP(t,a) for(register int t=head[a];t;t=e[t].nx)

define Max(a,b) ((a)<(b)?(b):(a))

define Min(a,b) ((a)<(b)?(a):(b))

define midd register int mid=(l+r)>>1

define TMP template < class ccf >

TMP inline ccf qr(ccf b){

char c=getchar();

int q=1;

ccf x=0;

while(c<48||c>57)

q=c==45?-1:q,c=getchar();

while(c>=48&&c<=57)

x=x*10+c-48,c=getchar();

return q==-1?-x:x;

}

const int maxn=10005;

const int maxm=100005;

struct E{

int to,nx;

}e[maxm<<1];

int head[maxn];

int col[maxn];

int cnt;

int n,m;

inline void add(int fr,int to,bool f){

e[++cnt]=(E){to,head[fr]};

head[fr]=cnt;

if(f)

add(to,fr,0);

}

queue < int > q;

inline int bfs(int S){

q.push(S);

col[S]=-1;

int colcnt=0,tolcnt=0;

while(!q.empty()){

register int now=q.front();

colcnt+=(col[now]==1);

tolcnt++;

q.pop();

ERP(t,now)

if(col[e[t].to]!=0&&col[e[t].to]!=-col[now])

return -1;

else

if(col[e[t].to]==0)

q.push(e[t].to),col[e[t].to]=-col[now];

}

return Min(colcnt,tolcnt-colcnt);

}

int main(){

ifndef ONLINE_JUDGE

freopen("in.in","r",stdin);
freopen("out.out","w",stdout);

endif

n=qr(1);
m=qr(1);
for(register int t=1,t1,t2;t<=m;++t){
t1=qr(1);
t2=qr(1);
add(t1,t2,1);
}
int ans=0,k;
RP(t,1,n)
if(col[t]==0)
    if((k=bfs(t))==-1)
    return puts("Impossible"),0;
    else
    ans+=k;
cout<<ans<<endl;
return 0;

}



【题解】【总结】P1330封锁阳关大学&&图论小总结

原文地址:https://www.cnblogs.com/winlere/p/10358136.html

时间: 2024-10-10 11:27:35

【题解】【总结】P1330封锁阳关大学&&图论小总结的相关文章

洛谷p1330 封锁阳光大学

P1330 封锁阳光大学 335通过 907提交 题目提供者yeszy 标签图论福建省历届夏令营 难度普及+/提高 提交该题 讨论 题解 记录 最新讨论 为什么本地会报202? 给一个样例 题目描述 曹是一只爱刷街的老曹,暑假期间,他每天都欢快地在阳光大学的校园里刷街.河蟹看到欢快的曹,感到不爽.河蟹决定封锁阳光大学,不让曹刷街. 阳光大学的校园是一张由N个点构成的无向图,N个点之间由M条道路连接.每只河蟹可以对一个点进行封锁,当某个点被封锁后,与这个点相连的道路就被封锁了,曹就无法在与这些道路

洛谷P1330 封锁阳光大学(二分图染色)

P1330 封锁阳光大学 题目描述 曹是一只爱刷街的老曹,暑假期间,他每天都欢快地在阳光大学的校园里刷街.河蟹看到欢快的曹,感到不爽.河蟹决定封锁阳光大学,不让曹刷街. 阳光大学的校园是一张由N个点构成的无向图,N个点之间由M条道路连接.每只河蟹可以对一个点进行封锁,当某个点被封锁后,与这个点相连的道路就被封锁了,曹就无法在与这些道路上刷街了.非常悲剧的一点是,河蟹是一种不和谐的生物,当两只河蟹封锁了相邻的两个点时,他们会发生冲突. 询问:最少需要多少只河蟹,可以封锁所有道路并且不发生冲突. 输

P1330 封锁阳光大学

P1330 封锁阳光大学 题目描述 曹是一只爱刷街的老曹,暑假期间,他每天都欢快地在阳光大学的校园里刷街.河蟹看到欢快的曹,感到不爽.河蟹决定封锁阳光大学,不让曹刷街. 阳光大学的校园是一张由N个点构成的无向图,N个点之间由M条道路连接.每只河蟹可以对一个点进行封锁,当某个点被封锁后,与这个点相连的道路就被封锁了,曹就无法在与这些道路上刷街了.非常悲剧的一点是,河蟹是一种不和谐的生物,当两只河蟹封锁了相邻的两个点时,他们会发生冲突. 询问:最少需要多少只河蟹,可以封锁所有道路并且不发生冲突. 输

P1330 封锁阳光大学(染色问题)

P1330 封锁阳光大学 题目描述 曹是一只爱刷街的老曹,暑假期间,他每天都欢快地在阳光大学的校园里刷街.河蟹看到欢快的曹,感到不爽.河蟹决定封锁阳光大学,不让曹刷街. 阳光大学的校园是一张由N个点构成的无向图,N个点之间由M条道路连接.每只河蟹可以对一个点进行封锁,当某个点被封锁后,与这个点相连的道路就被封锁了,曹就无法在与这些道路上刷街了.非常悲剧的一点是,河蟹是一种不和谐的生物,当两只河蟹封锁了相邻的两个点时,他们会发生冲突. 询问:最少需要多少只河蟹,可以封锁所有道路并且不发生冲突. 输

luogu P1330 封锁阳光大学 x

P1330 封锁阳光大学 题目描述 曹是一只爱刷街的老曹,暑假期间,他每天都欢快地在阳光大学的校园里刷街.河蟹看到欢快的曹,感到不爽.河蟹决定封锁阳光大学,不让曹刷街. 阳光大学的校园是一张由N个点构成的无向图,N个点之间由M条道路连接.每只河蟹可以对一个点进行封锁,当某个点被封锁后,与这个点相连的道路就被封锁了,曹就无法在与这些道路上刷街了.非常悲剧的一点是,河蟹是一种不和谐的生物,当两只河蟹封锁了相邻的两个点时,他们会发生冲突. 询问:最少需要多少只河蟹,可以封锁所有道路并且不发生冲突. 输

luogu P1330 封锁阳光大学--图上染色

P1330 封锁阳光大学 题目描述 曹是一只爱刷街的老曹,暑假期间,他每天都欢快地在阳光大学的校园里刷街.河蟹看到欢快的曹,感到不爽.河蟹决定封锁阳光大学,不让曹刷街. 阳光大学的校园是一张由N个点构成的无向图,N个点之间由M条道路连接.每只河蟹可以对一个点进行封锁,当某个点被封锁后,与这个点相连的道路就被封锁了,曹就无法在与这些道路上刷街了.非常悲剧的一点是,河蟹是一种不和谐的生物,当两只河蟹封锁了相邻的两个点时,他们会发生冲突. 询问:最少需要多少只河蟹,可以封锁所有道路并且不发生冲突. 输

洛谷 P1330 封锁阳光大学 Label:染色问题

题目描述 曹是一只爱刷街的老曹,暑假期间,他每天都欢快地在阳光大学的校园里刷街.河蟹看到欢快的曹,感到不爽.河蟹决定封锁阳光大学,不让曹刷街. 阳光大学的校园是一张由N个点构成的无向图,N个点之间由M条道路连接.每只河蟹可以对一个点进行封锁,当某个点被封锁后,与这个点相连的道路就被封锁了,曹就无法在与这些道路上刷街了.非常悲剧的一点是,河蟹是一种不和谐的生物,当两只河蟹封锁了相邻的两个点时,他们会发生冲突. 询问:最少需要多少只河蟹,可以封锁所有道路并且不发生冲突. 输入输出格式 输入格式: 第

P1330 封锁阳光大学(搜索+图的遍历和存储)

给你一幅图,问你最少占领几个点,能够封锁阳光大学,但是不能占领一条边的两个点 就是每条边有且只有一个点能被占领,这么一来,每个连通分量只可能有两个方案(占领变不占领),所以直接搜,加上少的就好了 1 #include<iostream> 2 using namespace std; 3 const int N=1e5+100; 4 int cnt=0; 5 struct node 6 { 7 int to;//到的点 8 int from;//出发点相同的边在数组中的位置 9 }edge[N]

洛谷 P1330 封锁阳光大学

题目描述 曹是一只爱刷街的老曹,暑假期间,他每天都欢快地在阳光大学的校园里刷街.河蟹看到欢快的曹,感到不爽.河蟹决定封锁阳光大学,不让曹刷街. 阳光大学的校园是一张由N个点构成的无向图,N个点之间由M条道路连接.每只河蟹可以对一个点进行封锁,当某个点被封锁后,与这个点相连的道路就被封锁了,曹就无法在与这些道路上刷街了.非常悲剧的一点是,河蟹是一种不和谐的生物,当两只河蟹封锁了相邻的两个点时,他们会发生冲突. 询问:最少需要多少只河蟹,可以封锁所有道路并且不发生冲突. 输入输出格式 输入格式: 第