QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#80440#1359. Setting MapsXZTmaxsmall67WA 0ms3628kbC++232.1kb2023-02-23 18:32:422023-02-23 18:32:43

Judging History

你现在查看的是最新测评结果

  • [2023-08-10 23:21:45]
  • System Update: QOJ starts to keep a history of the judgings of all the submissions.
  • [2023-02-23 18:32:43]
  • 评测
  • 测评结果:WA
  • 用时:0ms
  • 内存:3628kb
  • [2023-02-23 18:32:42]
  • 提交

answer

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e6+10,inf=1e18;
struct MaxFlow
{
	int tot;
	int head[N],now[N];
	struct Edge{int to,nxt,flw;}e[N<<1];
	void ADD(int x,int y,int flw){e[++tot]={y,head[x],flw};head[x]=tot;}
	void add(int x,int y,int flw){ADD(x,y,flw);ADD(y,x,0);}
	int n,S,T,mxflw;
	void clear(){n=S=T=mxflw=0;tot=1;}
	MaxFlow(){clear();}
	int dep[N];
	int bfs()
	{
		for(int i=1;i<=n;i++)dep[i]=inf,now[i]=head[i];
		queue<int>q;q.push(S);
		dep[S]=1;
		while(!q.empty())
		{
			int x=q.front();q.pop();
			for(int i=head[x];i;i=e[i].nxt)
			{
				int y=e[i].to,flw=e[i].flw;
				if(!flw||dep[y]!=inf)continue;
				q.push(y);dep[y]=dep[x]+1;
			}
		}
		return dep[T]!=inf;
	}
	int dfs(int x,int flow)
	{
		if(x==T)return flow;
		int res=0;
		for(int &i=now[x];i&&flow;i=e[i].nxt)
		{
			int y=e[i].to,flw=e[i].flw;
			if(!flw||dep[y]!=dep[x]+1)continue;
			int bck=dfs(y,min(flow,flw));
			if(!bck){dep[y]=inf;continue;}
			e[i].flw-=bck;e[i^1].flw+=bck;
			res+=bck;flow-=bck;
		}
		return res;
	}
	int MF(int _n,int _S,int _T)
	{
		n=_n,S=_S,T=_T;mxflw=0;
		while(bfs())mxflw+=dfs(S,inf);
		return mxflw;
	}
}G;
const int M=10;
int n,m,k,S,T,st,en,tot;
int c[N];
int in[N][M],out[N][M];
signed main()
{
	scanf("%lld%lld%lld%lld%lld",&n,&m,&k,&st,&en);
	for(int i=1,w;i<=n;i++)
	{
		scanf("%lld",&w);
		for(int j=0;j<k;j++)
		{
			in[i][j]=++tot,out[i][j]=++tot;G.add(in[i][j],out[i][j],w);
			if(j)G.add(in[i][j-1],out[i][j],inf),G.add(in[i][j-1],in[i][j],inf),G.add(out[i][j-1],out[i][j],inf);
		}
	}
	S=++tot,T=++tot;
	G.add(S,in[st][0],1e9);
	for(int j=0;j<k;j++)G.add(out[en][j],T,inf);
	for(int i=1,x,y;i<=m;i++)
	{
		scanf("%lld%lld",&x,&y);
		for(int j=0;j<k;j++)G.add(out[x][j],in[y][j],inf),G.add(out[y][j],in[x][j],inf);
	}
	if(G.MF(tot,S,T)==inf)return puts("-1"),0;
	vector<int>vt;
	for(int i=1;i<=n;i++)
		for(int j=0;j<k;j++)
			if((G.dep[in[i][j]]!=inf)&&(G.dep[out[i][j]]==inf)){vt.push_back(i);break;}
	printf("%lld\n",(int)vt.size());
	for(auto y:vt)printf("%lld ",y);puts("");
	return 0;
}

详细

Test #1:

score: 0
Wrong Answer
time: 0ms
memory: 3628kb

input:

3 2 5
1 3
1 60 35
1 2
2 3

output:

0


result:

wrong answer Given vertex set from user output does not cover k vertices in some path