分糖果+对抗赛

对抗赛

60e4f4ff02224760a18336d6cace53f3.png

这个题实力演绎了什么叫做玄学。。。加快读就过不加快读就不过=_=本地编译的时候跑出来明明是对的放到测评机来跑就能跑出来个零

分糖果

20133877d10d427c87fb508b8793c1fc.png

数据已经毒到一定境界了,第一次 60

#include<bits/stdc++.h>
using namespace std;
int n,m,p,c,cnt,ans;
int head[100010],vis[100010],dis[100010];
struct node{int to,next,val;}e[2000010];
void add_edge(int u,int v)
{
	e[++cnt].to=v;
	e[cnt].next=head[u];
	e[cnt].val=1;
	head[u]=cnt;
}
int main()
{
	freopen("candy.in","r",stdin);
	freopen("candy.out","w",stdout);
	memset(dis,0x3f3f3f,sizeof dis);
	memset(head,0,sizeof head);
	scanf("%d%d%d%d",&n,&p,&c,&m);
	for(int i=1;i<=p;i++)
	{
		int u,v,w;
		scanf("%d%d",&u,&v);
		add_edge(u,v);
		add_edge(v,u);
	}
	dis[c]=0;
	vis[c]=1;
	queue<int>q;
	q.push(c);
	while(!q.empty())
	{
		int u=q.front();
		q.pop();
		for(int i=head[u];i;i=e[i].next)
		{
			int v=e[i].to;
			if(dis[u]+e[i].val<dis[v])
			{
				dis[v]=dis[u]+e[i].val;
				ans=max(ans,dis[v]);
				if(!vis[v])
				{
					q.push(v);
					vis[v]=1;
				}
			}
		}
		vis[u]=0;
	}
	printf("%d",ans+m+1);
	return 0;
}
/*
4 3 1
2
1 2
2 3
1 4
*/

第二次70

#include<bits/stdc++.h>
using namespace std;
int n,m,p,c,cnt,a,b=1,q[100010][2],head[100010];
struct node{int to,next;}e[2000010];
bool vis[100010];
void add_edge(int u,int v)
{
	e[++cnt].to=v;
	e[cnt].next=head[u];
	head[u]=cnt;
}
void bfs()
{
	q[1][0]=c,q[1][1]=1;
	vis[c]=1;
	while(b>a)
	{
		a++;
		for(int i=head[q[a][0]];i;i=e[i].next)
		{
			if(!vis[e[i].to])
			{
				q[++b][0]=e[i].to;
				q[b][1]=q[a][1]+1;
				vis[e[i].to]=1;
			}
		}
	}
}
int main()
{
	freopen("candy.in","r",stdin);
	freopen("candy.out","w",stdout);
	memset(head,0,sizeof head);
	scanf("%d%d%d%d",&n,&p,&c,&m);
	for(int i=1;i<=p;i++)
	{
		int u,v;
		scanf("%d%d",&u,&v);
		add_edge(u,v);
		add_edge(v,u);
	}
	bfs();
	printf("%d",q[b][1]+m); 
	return 0;
}
/*
4 3 1
2
1 2
2 3
1 4
*/

最后用上了平生所学所有优化技巧。所以日常优化很重要

#include<bits/stdc++.h>
using namespace std;
#define N 100010
int n,m,f,t,head[N],dis[N],cnt;
struct edge
{ int to,nxt; } e[2000010];
int read()
{
	int x=0,f=1;
	char c=getchar();
	while(c>'9'||c<'0')
	{
		if(c=='-') f=-1;
		c=getchar();
	}
	while(c>='0'&&c<='9')
	{
		x=(x<<1)+(x<<3)+(c^48);
		c=getchar();
	}
	return x*f;
}
inline void add(int u,int v)
{
	e[++cnt].to=v;
	e[cnt].nxt=head[u];
	head[u]=cnt;
}
typedef pair<int,int> pr;
priority_queue<pr,vector<pr>,greater<pr> > q;
inline void dij()
{
	memset(dis,0x3f3f3f3f,sizeof(dis));
	dis[f]=1;
	q.push(make_pair(1,f));
	while(!q.empty())
	{
		int x=q.top().second;
		q.pop();
		for(register int i(head[x]); i; i=e[i].nxt)
		{
			int v=e[i].to;
			if(dis[v]>dis[x]+1)
				dis[v]=dis[x]+1,q.push(make_pair(dis[v],v));
		}
	}
}
int main()
{
	freopen("candy.in","r",stdin);
	freopen("candy.out","w",stdout);
	n=read(),m=read(),f=read(),t=read();
	for(register int i=1; i<=m; ++i)
	{
		int u=read();
		int v=read();
		add(u,v);
		add(v,u);
	}
	dij();
	int ans=0;
	for(register int i=1; i<=n; ++i) ans=max(ans,dis[i]);
	printf("%d",ans+t);
	return 0;
}

所以:

  1. 快读
  2. register int
  3. ++i
  4. inline void/int
  5. 习惯性priority

随手优化

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xiyuping24

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值