WA+RE求助
查看原帖
WA+RE求助
29502
YangHao楼主2022/9/15 11:31

我的思路是用虚点建边然后跑spfa 评测记录

#include <cstdio>
#include <cstdlib>
#include <cstring>

const int MAXN=1010;

struct edge{
	int x, y, d, next;
}e[MAXN*MAXN*2];
int len=0, a[MAXN], tmp[MAXN];
int first[MAXN*2];
int n, m, num;
int ST, ED;

void ins (int x, int y, int d){
	e[++len].x=x; e[len].y=y; e[len].d=d;
	e[len].next=first[x]; first[x]=len;
}
inline int read (){
	int x=0; char c;
	do c=getchar (); while ('0'>c||'9'<c);
	while ('0'<=c&&'9'>=c)
		x=x*10+c-48, c=getchar ();
	return x;
}
void buildmap (){
	n=read (); m=read ();
	memset (first, 0, sizeof (first));
	for (int i=1; i<=m; ++i){
		num=read ();
		memset (tmp, 0, sizeof (tmp));
		for (int j=1; j<=num; ++j){
			a[j]=read ();
			tmp[a[j]]=1;
		}
		for (int j=a[1]; j<=a[num]; ++j)
			if (tmp[j])
				ins (n+i, j, 1);
			else
				ins (j, n+i, 0);
	}
    //虚拟原点、虚拟汇点
	ST=n+m+1; ED=n+m+2;
	for (int i=1; i<=n; ++i){
		ins (ST, i, 1);
		ins (i, ED, 0);
	}
}
int q[MAXN*MAXN*2], tf[MAXN*2];
int bfs (){
	memset (a, 0, sizeof (a));
	memset (tf, 0, sizeof (tf));
	int st=1, ed=2;
	q[1]=ST; tf[ST]=1;
	while (st<ed){
		int x=q[st];
		for (int i=first[x]; i; i=e[i].next){
			int y=e[i].y;
			if (a[y]<a[x]+e[i].d){
				a[y]=a[x]+e[i].d;
				if (!tf[y]){
					tf[y]=1;
					q[ed++]=y;
				}
			}
		}
		++st; tf[x]=0;
	}
	return a[ED];
}
int main (){
	buildmap ();
	printf ("%d", bfs ());
}
2022/9/15 11:31
加载中...