求助p5191(题目做的人太少了,所以发这里来了)
  • 板块学术版
  • 楼主Hoks
  • 当前回复6
  • 已保存回复6
  • 发布时间2022/12/30 11:15
  • 上次更新2023/10/24 06:09:09
查看原帖
求助p5191(题目做的人太少了,所以发这里来了)
551100
Hoks楼主2022/12/30 11:15

代码如下

#include<bits/stdc++.h>
#define int long long
using namespace std;
struct node
{int v,nxt,f;}e[200010];
struct edge
{int x,f;}a[1010];
int d,m,n,tot,cnt;
int head[1010],book[1010],mp2[1010];
void add(int x,int y)
{
	e[++tot].v=y,e[tot].nxt=head[x],head[x]=tot,e[tot].f=1;
	e[++tot].v=x,e[tot].nxt=head[y],head[y]=tot,e[tot].f=0;
}
void down(int step)
{
	for(int i=head[step];i;i=e[i].nxt)
		if(!book[e[i].v]&&e[i].f)
			a[++cnt].x=e[i].v,a[cnt].f=0,book[e[i].v]=1,down(e[i].v);
}
void up(int step)
{
	int num=0,mp[1010]={0},sum=0,mp1[1010];
	for(int i=head[step];i;i=e[i].nxt)
		if(!e[i].f)
		{
			num++;
			if(!mp[e[i].v]) mp1[++sum]=e[i].v;
			mp[e[i].v]++;
			for(int j=head[e[i].v];j;j=e[j].nxt)
			{
				if(e[j].v==step) continue;
				if(!mp[e[j].v]) mp1[++sum]=e[j].v;
				mp[e[j].v]++;
			}	
		}
	for(int i=1;i<=sum;i++)
		if(mp[mp1[i]]==num&&!book[mp1[i]])
			book[mp1[i]]=1,a[++cnt].x=mp1[i],a[cnt].f=1;
}
int read()
{
	char c=getchar();int x=0,f=1;
	while(!isdigit(c)){if(c=='-') f=-1;c=getchar();}
	while(isdigit(c)) x=(x<<1)+(x<<3)+(c^48),c=getchar();
	return x*f;
}
bool cmp(edge x,edge y){return x.x<y.x;}
signed main()
{
	d=read(),m=read(),n=read();
	for(int i=1,x,y;i<=m;i++) x=read(),y=read(),add(x,y);
	for(int i=1,x;i<=n;i++) x=read(),a[++cnt].x=x,a[cnt].f=1,book[x]=1;
	for(int i=1;i<=cnt;i++)
	{
		if(a[i].f) down(a[i].x);
		up(a[i].x);
	}
	sort(a+1,a+1+cnt,cmp);
	for(int i=1;i<=cnt;i++) 
		if(!mp2[a[i].x]) cout<<a[i].x<<" ",mp2[a[i].x]=1;
	return 0;
}

40分,Wa6个点

2022/12/30 11:15
加载中...