这篇博客大部分在写我的错解……明明很简单的一道题,知道正解后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. Ubuntu 16.04 LTS安装Docker最新版

    一.安装Docker的先决条件 1.运行64位CPU构架的计算机(目前只能是x86_64和amd64),请注意,Docker目前不支持32位CPU.2.运行Linux 3.8或更高版本内核.一些老版本 ...

  2. 前后端分离后API交互如何保证数据安全性

    前后端分离后API交互如何保证数据安全性? 一.前言 前后端分离的开发方式,我们以接口为标准来进行推动,定义好接口,各自开发自己的功能,最后进行联调整合.无论是开发原生的APP还是webapp还是PC ...

  3. round 469

    第一次打codeforces,还是太菜了 代码全部来自大神void_f C #include <cstdio> #include <vector> #include <c ...

  4. hive-hbase表的建立

    HIVE-HBASE表CDH4的时候不成熟select*的时候会查询不出(必须通过字段名称),CDH5已经修复这点需要注意 接口表hive部分一般不做join select会占性能,因为hbase接口 ...

  5. HR招聘_(六)_招聘方法论(面试环节·面试方法)

    面试方法:常用行为面试和压力面试 行为面试法 定义: 通过要求面试对象描述其过去某项工作或者生活经历的具体情况来了解面试对象各方面素质特征的方法.行为面试法的基本假设是:一个人过去的行为可以预测这个人 ...

  6. 第二周<导学/分类>

    分类学习 分类算法各有不同 knn naivebyes regression dnn sklearn.linear_modlel 线性函数 sklearn.preprocessing 非线性函数 分类 ...

  7. vue移动端项目

    用vue mint-ui  jquery-weui写了一个移动端demo 技术栈 vue2.0 vue-router axios mint-ui jquery-weui webpack 页面截图 最后 ...

  8. 海胜专访--MaxCompute 与大数据查询引擎的技术和故事

    摘要:在2019大数据技术公开课第一季<技术人生专访>中,阿里巴巴云计算平台高级技术专家苑海胜为大家分享了<MaxCompute 与大数据查询引擎的技术和故事>,主要介绍了Ma ...

  9. leaflet的入门开发

    2016年9月27日—1.0leaflet,最快的,最稳定和严谨的leaflet,终于出来了! leaflet是领先的开源JavaScript库为移动设备设计的互动地图.重33 KB的JS,所有映射大 ...

  10. Anaconda入门使用指南

    打算学习 Python 来做数据分析的你,是不是在开始时就遇到各种麻烦呢? 到底该装 Python2 呢还是 Python3 ? 为什么安装 Python 时总是出错? 怎么安装工具包呢? 为什么提示 ...