这篇博客大部分在写我的错解……明明很简单的一道题,知道正解后10分钟AC,然而几个错解打的想死……

错解1 WA40:

鬼知道这40分哪来的……这也是考试最后很无奈地交上去的代码,最后剩20分钟时发现这是错的,最后剩7分钟想出错解2,我也是醉了……

先说一下思路吧,首先跑一边Dijkstra记录1到n的最短路,那么必经点一定在这条路径上。然后怎么搞呢?以下纯属YY,从n开始向回扫,遇到第一个dis不是INF的停止……鬼知道我咋想的,其实是为了QJ样例。

 tem=n;
while(tem!=)
{
if(tem!=n)ans.push_back(tem);
if(dis[tem]!=INF)break;
nex[u(pre[tem])]=tem;
tem=u(pre[tem]);
}

代码片段

错解2 WA90:

只能说测试点有点水啊,接着上面说,找到了最短路,必经点在这条路径上,但是这条路径上的点不一定都是必经点,什么情况下点i不是毕竟点呢?我们可以发现,当i被一条其他边覆盖时,i一定不是必经点,这里的覆盖不包括连接:如图节点3就被覆盖,而节点2,4就不算被覆盖,知道了这个结论,我们就可以求出来答案了,具体怎么做呢?首先tarjan缩边双,记录每个边双在这条路径上的端点,那么我们就可一求出答案了。但是难点就在于边双的端点记录起来比较难以实现。以上是正确结论,以下纯属YY:

可以发现端点一定是和桥连着的,所以我们连索点都省了,只需要记录这条路径,然后tarjan求割边,枚举边,将即在这条路径上又是桥的边的端点(1,n除外)扔入vector,最后排序去重即可。

显然以上YY是错的(其实可能并不显然),直接上数据好了:

如图,显然4是必经点,但是4没有与割边连接,只能说测试点太水了,居然有90分……

 #include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<queue>
#define int long long
#define MAXN 2000010
#define MP(a,b) make_pair(a,b)
#define ma(x) memset(x,0,sizeof(x))
#define min(a,b) ((a)<(b)?(a):(b))
using namespace std;
const int L=<<|;
char buffer[L],*S,*T;
#define getchar() ((S==T&&(T=(S=buffer)+fread(buffer,1,L,stdin),S==T))?EOF:*S++)
struct edge
{
int u,v,nxt;
#define u(x) ed[x].u
#define v(x) ed[x].v
#define n(x) ed[x].nxt
}ed[MAXN*];
int first[MAXN],num_e=;
#define f(x) first[x]
int TT,n,m;
int dfn[MAXN],low[MAXN],cnt;
bool bridge[MAXN*];
void tarjan(int x,int edg,int fa)
{
dfn[x]=low[x]=++cnt;
for(int i=f(x);i;i=n(i))
if(!dfn[v(i)])
{
tarjan(v(i),i,x),low[x]=min(low[x],low[v(i)]);
if(low[v(i)]>dfn[x])
bridge[i]=bridge[i^]=;
}
else if(v(i)!=fa&&(i^)!=edg)low[x]=min(low[x],dfn[v(i)]);
}
int dis[MAXN];bool v[MAXN];
int pre2[MAXN];
void dist2(int st)
{
for(int i=;i<=n;i++)dis[i]=0x7ffffffffff,v[i]=;
dis[st]=;
priority_queue<pair<int,int> >q;
q.push(MP(,st));
while(!q.empty())
{
int x=q.top().second;q.pop();
if(v[x])continue;v[x]=;
for(int i=f(x);i;i=n(i))
if(dis[v(i)]>dis[x]+)
{
dis[v(i)]=dis[x]+;
pre2[v(i)]=i;
q.push(MP(-dis[v(i)],v(i)));
}
}
}
bool is[MAXN*];
int ans[MAXN*],an;
inline void add(int u,int v);
inline int read()
{
int s=;char a=getchar();
while(a<''||a>'')a=getchar();
while(a>=''&&a<=''){s=s*+a-'';a=getchar();}
return s;
}
signed main()
{
// freopen("in.txt","r",stdin);
// freopen("0.out","w",stdout); cin>>TT;
while(TT--)
{ cnt=;num_e=;ma(ans),an=;
n=read(),m=read();
for(int i=;i<=n;i++)first[i]=is[i]=pre2[i]=low[i]=dfn[i]=;
ma(bridge);ma(is);
int ta,tb;
for(int i=;i<=m;i++)
{
ta=read(),tb=read();
add(ta,tb),add(tb,ta);
}
dist2();
int tem=n;
while(tem!=)
{
is[pre2[tem]]=is[pre2[tem]^]=;
tem=u(pre2[tem]);
}
for(int i=;i<=n;i++)
if(!dfn[i])tarjan(i,,);
for(int i=;i<=num_e;i+=)
if(bridge[i]&&is[i])
{
if(u(i)!=&&u(i)!=n)ans[++an]=u(i);
if(v(i)!=&&v(i)!=n)ans[++an]=v(i);
}
sort(ans+,ans+an+);
int m=unique(ans+,ans+an+)-ans-;
printf("%lld\n",m);
for(int i=;i<=m;i++)
printf("%lld ",ans[i]);
printf("\n");
}
}
inline void add(int u,int v)
{
++num_e;
u(num_e)=u;
v(num_e)=v;
n(num_e)=f(u);
f(u)=num_e;
}

错解代码也放一下吧

正解:

以上纯属扯淡,其实这个题还是求割点,只要在tarjan是加一句特判就可以了,几乎就是裸的tarjan……

#include<iostream>
#include<cstring>
#include<cstdio>
#define ma(x) memset(x,0,sizeof(x))
#define MAXN 2000010
using namespace std;
struct edge
{
int u,v,nxt;
#define u(x) ed[x].u
#define v(x) ed[x].v
#define n(x) ed[x].nxt
}ed[MAXN*2];
int first[MAXN],num_e;
#define f(x) first[x] int n,m;
int dfn[MAXN],low[MAXN],num,root;
bool cut[MAXN];
int stack[MAXN],top;
void tarjan(int x)
{
dfn[x]=low[x]=++num;
stack[++top]=x;
if(x==root&&!f(x)){return;}
int flag=0;
for(int i=f(x);i;i=n(i))
if(!dfn[v(i)])
{
tarjan(v(i)),low[x]=min(low[x],low[v(i)]);
if(low[v(i)]>=dfn[x]&&dfn[v(i)]<=dfn[n]&&dfn[n])//x是割点,如果dfn[v(i)]<=dfn[n]则说明如果要到n必须经过x。
{
flag++;
if(x!=root||flag>1) cut[x]=1;
}
}
else low[x]=min(low[x],dfn[v(i)]);
}
int TT;
inline int read()
{
int s=0;char a=getchar();
while(a<'0'||a>'9')a=getchar();
while(a>='0'&&a<='9'){s=s*10+a-'0';a=getchar();}
return s;
}
inline void add(int u,int v)
{
++num_e;
u(num_e)=u;
v(num_e)=v;
n(num_e)=f(u);
f(u)=num_e;
}
signed main()
{
cin>>TT;
while(TT--)
{
ma(first);ma(cut);num=root=top=0;ma(ed);ma(dfn);ma(low);
n=read(),m=read();
int ta,tb;
for(int i=1;i<=m;i++)
{
ta=read(),tb=read();
add(ta,tb),add(tb,ta);
}
for(int i=1;i<=n;i++)
if(!dfn[i])root=i,tarjan(i);
int nn=0;
for(int i=2;i<n;i++)
if(cut[i])nn++;
printf("%d\n",nn);
for(int i=2;i<n;i++)
if(cut[i])printf("%d ",i);
puts("");
}
}

HZOJ 回家的更多相关文章

  1. flhs笔试题-回家上机实践

    这是最近参加的一个公司的笔试题,回家上机写了下代码,希望对有需要的小伙伴有用,简单实现字符串和数组在指定位置的插入: package org.flhs; import com.google.commo ...

  2. 三石推荐!把 Bootstrap 小清新带回家!

    无敌传送门:http://fineui.com/demo_pro/default.aspx?theme=bootstrap1&menu=accordion   喜欢就来赞一个! 把麻烦留给三石 ...

  3. 不写完不让回家的JQuery的事件与动画

    在这看不见太阳的小黑屋里,苦逼的一天又开始了 好了闲话我也就不扯了,接下来我就来说说我对jQuery事件和动画的理解吧!!! 还是得再扯两句,我们敬爱的,Y老师讲完了,jQuery事件和动画,对着我们 ...

  4. 魔法禁书目录2:回家(codevs 3024)

    题目描述 Description 大妈打完三战回家,我知道他是怎么回来的,欧洲到日本有L个站点他决定乘坐恰好n次飞机(不是学院都市的超音速飞机)和m次火车来从第一个站点到达最后一个站点.但是有一点很重 ...

  5. iphone6 帶回家”活動!

    十一小長假即將來臨,周向榮還準備窩在家裏坐等“鋒菲戀”的後續結果嗎?雖然宅男無罪,但是請不要繼續在論壇裏高呼“李亞鵬娶了張柏芝”等口號,放下你“不吐槽會死星人”的特質,走出家門去領略一下祖國的大好山河 ...

  6. 回家前的挣扎——SQLite增删改查

    引言 最后一天,公司就两个人,也不知道弄点什么,就在网上找了Sqlite的文档,看了看,这里也是现学现卖,给自己找点事做,感觉时间过得还是比较快的,不然焦急等待,滋味不好受啊. SQLite简介 SQ ...

  7. 洛谷P1529 回家 Bessie Come Home

    P1529 回家 Bessie Come Home 题目描述 现在是晚餐时间,而母牛们在外面分散的牧场中. 农民约翰按响了电铃,所以她们开始向谷仓走去. 你的工作是要指出哪只母牛会最先到达谷仓(在给出 ...

  8. Bzoj 2834: 回家的路 dijkstra,堆优化,分层图,最短路

    2834: 回家的路 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 62  Solved: 38[Submit][Status][Discuss] D ...

  9. [Swust OJ 767]--将军回家(Dijkstra算法)

    题目链接:http://acm.swust.edu.cn/problem/767/ Time limit(ms): 1000 Memory limit(kb): 65535   Description ...

随机推荐

  1. postman发送get和post请求

    一.postman发送get请求   在地址栏里输入请求url(用到拼接方式):http://127.0.0.1:8081/getuser?userid=1 选择“GET”方式, 点击“send”得到 ...

  2. Django+小程序技术打造微信小程序助手

    Django+小程序技术打造微信小程序助手   整个课程都看完了,当前这个课程的分享可以往下看,下面有某盘的链接,之前做java开发也做了一些年头,也分享下自己看这个视频的感受,同时也分享下自己的总结 ...

  3. neo4j批量导入neo4j-import

    neo4j数据批量导入 1 neo4j基本参数 1.1 启动与关闭: 1.2 neo4j-admin的参数:控制内存 1.2.1 memrec 是查看参考内存设置 1.2.2 指定缓存–pagecac ...

  4. neo4j中对节点关系和聚类的思考

    由于neo4j在查找过程中具有事务,所以查询的速度非常慢!给出的建议如下: 一,将所有查询放在一个Session中,当所有查询完毕以后在关闭Driver和Session: 二,使用neo4j连接池,使 ...

  5. 微信小程序之项目的创建

    之前就想学习一下微信小程序,只不过前段时间在学习Java中的一些线程的知识,拖了很久也没有实行这个目标,今天终于从网上找了一个完整的视频,来从头学习完整的开发流程,现在逐渐有一种想法,就是自己构建项目 ...

  6. LUOGU 2593 : [Zjoi2006] 超级麻将

    传送门 解题思路 直接爆搜全T..状态数太多了,所以我们考虑贪心+剪枝.贪心:先拿三个连着的,再拿四个一样的,再拿三个一样的,最后拿两个一样的这样的搜索顺序最优,两个的放最后是因为只要这样的一个,三个 ...

  7. Linux 7.X 网络配置

    Linux 7.X 网络配置 环境: 笔记本中安装了虚拟机,在虚拟机中安装了Redhat 7.4版本的操作系统,现配置该操作系统网络.(IP.网关等) 相关指令如下: # nmcli connecti ...

  8. Swift 之类的继承与类的访问权限

    http://www.cocoachina.com/swift/20160104/14821.html 上一篇博客<窥探Swift之别具一格的Struct和Class>的博客可谓是给Swi ...

  9. 为Apple Watch而战-----(初级篇)

    重要 本文档是开发过程中使用的API或者技术的初步文档.苹果提供该文档以便于开发者使用苹果产品上使用技术和编程接口.后期该文档中信息会有所变动,所以依据本文档开发的软件应当使用最终的操作系统软件进行测 ...

  10. 【转】基于OLSR路由协议实现Ad-Hoc组网

    一.软件包的安装 1. olsrd软件包的安装 libpthread_0.9.33.2-1_ar71xx.ipk olsrd_0.6.6.2-4_ar71xx.ipk 2. luci的安装 olsrd ...