Timo's mushrooms CSU - 1991 (第十三届湖南省赛热身赛题)
题目链接:点击打开链接
题目大意:提莫埋了很多蘑菇,有些蘑菇之间有一条有向边,u->v,若u爆炸则v爆炸,而且每个蘑菇只能引起与之相连的一个蘑菇的爆炸(当时题目意思读错,以为是求单向联通分量,然后大错特错~~~~),就是求有向图上的最小路径覆盖,不过因为原图可能存在环,所以要先进行缩点后在跑二分匹配求最小路径覆盖。
//wait...wait...这个是DAG上的最小路径覆盖,所以如果不进行缩点是一定会错的
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn=100010;
const int maxm=100010;
struct edge_t
{int v,next;
}edge[maxm],newedge[maxn];
int Ecnt,newEcnt;
int vertex[maxn],newvertex[maxn];
int Low[maxn],DFN[maxn],Stack[maxn],Belong[maxn];
int Index,top;
int scc;
bool Instack[maxn];
void init_Graph()
{Ecnt=newEcnt=0;memset(vertex,-1,sizeof(vertex));memset(newvertex,-1,sizeof(newvertex));
}
void make_edge(int u,int v)
{edge[Ecnt].v=v;edge[Ecnt].next=vertex[u];vertex[u]=Ecnt++;
}
void make_newedge(int u,int v)
{newedge[newEcnt].v=v;newedge[newEcnt].next=newvertex[u];newvertex[u]=newEcnt++;
}
void Tarjan(int u)
{int v;Low[u]=DFN[u]=++Index;Stack[top++]=u;Instack[u]=true;for(int i=vertex[u];i!=-1;i=edge[i].next){v=edge[i].v;if(!DFN[v]){Tarjan(v);if(Low[u]>Low[v]) Low[u]=Low[v];}else if(Instack[v]&&Low[u]>DFN[v])Low[u]=DFN[v];}if(Low[u]==DFN[u]){scc++;do{v=Stack[--top];Instack[v]=false;Belong[v]=scc;}while(v!=u);}
}
void solve(int n)
{memset(DFN,0,sizeof(DFN));memset(Instack,false,sizeof(Instack));Index=scc=top=0;for(int i=1;i<=n;i++)if(!DFN[i])Tarjan(i);
}
int linker[maxn];
bool used[maxn];
bool dfs(int u)
{for(int i=newvertex[u];i!=-1;i=newedge[i].next){int v=newedge[i].v;if(!used[v]){used[v]=true;if(linker[v]==-1||dfs(linker[v])){linker[v]=u;return true;}}}return false;
}
int hungary()
{int res=0;memset(linker,-1,sizeof(linker));for(int u=1;u<=scc;u++){memset(used,false,sizeof(used));if(dfs(u)) res++;}return res;
}
//缩点建立新图
void Build_newmap(int n)
{for(int u=1;u<=n;u++)for(int i=vertex[u];i!=-1;i=edge[i].next){int v=edge[i].v;if(Belong[u]!=Belong[v])make_newedge(Belong[u],Belong[v]);}
}
int main()
{int t;int n,m;int u,v;scanf("%d",&t);while(t--){init_Graph();scanf("%d%d",&n,&m);for(int i=0;i<m;i++){scanf("%d%d",&u,&v);make_edge(u,v);}solve(n);Build_newmap(n);printf("%d\n",scc-hungary());}return 0;
}
Timo's mushrooms CSU - 1991 (第十三届湖南省赛热身赛题)相关推荐
- 【蓝桥备赛冲刺】2022年第十三届省赛模拟题题解C/C++
食用该篇博客前须知: (0)第一次写博客,如有地方处理不好请见谅,后续会不断提高自己的写博客能力. (1)在头文件处偷了懒,使用的都是万能头文件.(最好还是自己要记住常用头文件 (2)使用的是C++, ...
- 蓝桥杯2022年第十三届省赛真题-纸张尺寸
题目描述 在 ISO 国际标准中定义了 A0 纸张的大小为 1189mm × 841mm,将 A0 纸沿长边对折后为 A1 纸,大小为 841mm × 594mm,在对折的过程中长度直接取下整(实际裁 ...
- 蓝桥杯题目 2682: 蓝桥杯2022年第十三届省赛真题-GCD
题目描述 给定两个不同的正整数 a, b,求一个正整数 k 使得 gcd(a + k, b + k) 尽可能大,其中 gcd(a, b) 表示 a 和 b 的最大公约数,如果存在多个 k,请输出所有满 ...
- 消除游戏——蓝桥杯2022年第十三届省赛真题
题目描述 在一个字符串 S 中,如果 S i = S i−1 且S i 不等于S i−1,则称 S i 和 S i+1 为边缘字符.如果S i 不等于S i−1且 S i = S i+1,则 S i− ...
- 蓝桥杯嵌入式第十三届省赛真题1
源码在这需要的可以自取 目录 1 题目 2 分析 3 项目结构 3.1 LCD显示部分 3.2 按键控制部分 3.3 密码部分 3.4 LED部分 3.5 数据处理部分 3.6 PWM控制部分 3.7 ...
- 每日一题——质因数个数(蓝桥杯2022年第十三届省赛真题)
如何将一个正整数分解质因数:每日一题--将一个正整数分解质因数_笨小古的博客-CSDN博客 题目描述:给定正整数 n,请问有多少个质数是 n 的约数. 输入格式:输入的第一行包含一个整数 n. 输出格 ...
- 蓝桥杯2022年第十三届省赛真题-选数异或
题目描述 给定一个长度为 n 的数列 A1, A2, · · · , An 和一个非负整数 x,给定 m 次查询, 每次询问能否从某个区间 [l,r] 中选择两个数使得他们的异或等于 x . 输入 输 ...
- 蓝桥杯2022年第十三届省赛真题-积木画
- 18年第十三届黑龙江省赛
2018年第十三届黑龙江省赛 现在的心情挺神奇的0.0,第一次出去参加ACM比赛,连着两场,黑龙江省赛和东北四省赛,感觉运气还是挺好的,黑龙江省赛(银)铜,东北四省赛铜,最大的感受就是感觉没有想象中的 ...
最新文章
- 土地档案管理系统需求分析
- php oracle视图,Oracle v$database视图分析
- Android VideoView播放视频遇到的问题
- 2021-2025年中国电子风扇速度控制器行业市场供需与战略研究报告
- redis在window下的启动
- mac下cordova的ios-deploy安装问题
- redist mysql_Windows下安装 MySQL
- K-means算法(知识点梳理)
- 使用OpenCV和Python构建自己的车辆检测模型
- 考拉情书---一片道歉叶
- OpenCV中(rows,cols)与图像(x,y)
- 分布式原理:一文了解 Gossip 协议
- CS 入门技能树测评
- ffmpeg 无损 剪切 分割 视频
- C#常用加密解密方法(AES加密解密)
- 运营好一个自媒体公众号,你还需要一个错别字检查工具
- Linux指令4-文本处理(grep,sek,awk)
- 还在找Mac版本的音乐合成器吗?看这里~
- super 的用法及意义
- leetcode55java_Leetcode-957 N 天后的牢房 Java 详细注释