这篇博客大部分在写我的错解……明明很简单的一道题,知道正解后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. Prime Ring Problem HDU - 1016 (dfs)

    Prime Ring Problem HDU - 1016 A ring is compose of n circles as shown in diagram. Put natural number ...

  2. js封装ajax的方法

    常用的ajax请求方法封装 /** * ajax请求的封装代码 */ function ajaxPost(url, params, cb) { $.ajax({ type : 'post', url ...

  3. Linux下允许MySQL 授权远程连接

    1.mysql -u root -p   (root)用户名 2.mysql>GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'r ...

  4. oracle-PL/SQL2

    一 存储过程 存储过程是SQL 语句和可选控制流语句的预编译集合,以一个名称存储并作为一个单元处理.在 ORACLE SERVER上建立存储过程,可以被多个应用程序调用,可以向存储过程传递参数,也可以 ...

  5. NOIP模拟17.9.22

    NOIP模拟17.9.22 前进![问题描述]数轴的原点上有一只青蛙.青蛙要跳到数轴上≥

  6. Hdu 3603

    Coach Yehr’s punishment Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/ ...

  7. CSS hack处理

    css hack指各版本及各品牌浏览器之间对CSS解释后出现网页内容的误差. 各浏览器CSS解析: 1.大部分特殊字符IE浏览器支持,其他主流浏览器firefox,chrome,opera,safar ...

  8. ubuntu上将常用程序拖到左侧栏目

  9. chrome://inspect调试html页面空白,DOM无法加载的解决方案

    chrome://inspect调试html页面空白,DOM无法加载的解决方案 先描述一下问题 有一段时间没碰huilder hybird app 开发了,今天调试的时候 chrome://inspe ...

  10. hdu3549 最大流

    #include<stdio.h> #include<string.h> #include<queue> #define MAXN 1010 using names ...