匹配

哈希能A

水到爆炸

回家

事实上我做过一个原题,甚至比这个回家难的多,而且那个题多组询问必经点

然后我做一组询问就打炸了

大约就是删了很多东西,然后自己想的太简单了

直接统计了割点,懒得打lca和树上差分,懒得打dfs,偷懒让我付出很大代价

最后只有10,

打代码一定不能偷懒,一定不能偷懒

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define A 810000
ll dfn[A],low[A],ver[A],nxt[A],head[A],s[A],fa[A],belong[A],kx[A];
ll Head[A],Nxt[A],Ver[A],To[A],vst[A];
ll tot=0,tot2=0,num=0,n,m,t,root;
vector<ll> dcc[A],ans;
bool cut[A];
void add(ll x,ll y){
nxt[++tot]=head[x],head[x]=tot,ver[tot]=y;
}
void Add(ll x,ll y){
Nxt[++tot2]=Head[x],Head[x]=tot2,Ver[tot2]=y;
}
inline ll read(){
ll f=1,x=0;char c=getchar();
while(!isdigit(c)){
if(c=='-') f=-1;
c=getchar();
}
while(isdigit(c)){
x=(x<<1)+(x<<3)+(c-'0');
c=getchar();
}
return f*x;
}
void tarjan(ll x)
{
ll flag=0;
dfn[x]=low[x]=++tot;
s[++s[0]]=x;
for(ll i=head[x];i;i=nxt[i])
{
ll y=ver[i];
if(!dfn[y])
{
tarjan(y);
low[x]=min(low[x],low[y]);
if(low[y]>=dfn[x])
{
flag++;
num++;
if(flag>1||x!=root)cut[x]=1;
while(s[0])
{
ll p=s[s[0]--];
dcc[num].push_back(p);
if(p==y)break;
}
dcc[num].push_back(x);
}
}
else low[x]=min(low[x],dfn[y]);
}
}
void dfs(ll x)
{
if(x==belong[n])return ;
vst[x]=1;
for(ll i=Head[x];i;i=Nxt[i])
{
ll y=Ver[i];
if(vst[y])continue;
fa[y]=x;
dfs(y);
}
return ;
}
void re(){
num=0,tot=0;ans.clear();tot2=0;
for(ll i=0;i<=800000;i++)
dcc[i].clear();
memset(nxt,0,sizeof(nxt));
memset(Head,0,sizeof(Head));
memset(Nxt,0,sizeof(Nxt));
memset(fa,0,sizeof(fa));
memset(vst,0,sizeof(vst));
memset(head,0,sizeof(head));
memset(ver,0,sizeof(ver));
memset(dfn,0,sizeof(dfn));
memset(low,0,sizeof(low));
memset(cut,0,sizeof(cut));
memset(kx,0,sizeof(kx));
}
int main()
{
t=read();
while(t--){
re();
n=read(),m=read();
for(ll i=1;i<=m;i++){
ll x=read(),y=read();
add(x,y);
add(y,x);
}
for(ll i=1;i<=n;i++)
if(!dfn[i]) root=i,tarjan(i);
ll nu=num;
for(ll i=1;i<=n;i++)
if(cut[i])belong[i]=++nu,kx[nu]=i;
for(ll i=1;i<=num;i++)
for(ll j=0;j<dcc[i].size();j++){
ll x=dcc[i][j];
if(cut[x]) Add(belong[x],i),Add(i,belong[x]);
else belong[x]=i;
}
/* for(ll i=1;i<=n;i++){
cout<<"belong="<<belong[i]<<endl;
}
*/ dfs(belong[1]);
ll x=fa[belong[n]];
while(x!=belong[1]){
if(x==0) break;
if(x>num) ans.push_back(kx[x]);
x=fa[x];
}
printf("%lld\n",1ll*ans.size());
sort(ans.begin(),ans.end());
for(ll i=0;i<ans.size();i++)
printf("%lld ",ans[i]);
cout<<endl;
}
}

最新文章

  1. Python 装饰器学习
  2. (译文)MVC通用仓储类
  3. Centos7下卸载docker
  4. jQuery图片延迟加载插件jQuery.lazyload使用方法(转)
  5. Control File (二)重建CONTROLFILE --- NORESETLOG
  6. 【POJ2104】kth num
  7. 【开源java游戏框架libgdx专题】-14-系统控件-Skin类
  8. [NOIP2001提高组]CODEVS1014 Car的旅行路线(最短路)
  9. Swift - 跳跃吃苹果游戏开发(SpriteKit游戏开发)
  10. Python学习笔记 变量
  11. hdu 2289 要二分的杯子
  12. Interger不可变原理
  13. django admin 或xdmin list_display search_fields list_filter 如果显示搜索外键或多对多字段
  14. VS2008兼容安装
  15. (转)windows下编译最新的x264
  16. Javascript 严格模式 strict mode(转)
  17. 【LG3242】 [HNOI2015]接水果
  18. FreeMarker 的使用方法
  19. webpack导入es6的简单应用
  20. html样式

热门文章

  1. 批处理用WINRAR只压缩某类型的文件
  2. 关于this的解析:看了就懂,忘记了随时回来看
  3. VS&#183;调试过程中某个操作导致调试突然退出之解决方案
  4. Vue3响应式系统api 之 ref reactive
  5. 交互-通过axios拦截器添加token认证
  6. [DB] CDH集群规划
  7. head元素的内容
  8. Docker——Registry 通过Shell管理私有仓库镜像
  9. 联想 lenove 3750 M4服务器更改启动项和管理口IP
  10. Python基础之PyCharm快捷键大全