萌新求hack(91pts WA on #3)
查看原帖
萌新求hack(91pts WA on #3)
482049
Alex_wcq楼主2023/2/11 10:59

如题,wtcl。

不是讨论区里的 WA on #2;#3 显示 wrong answer Expected no sulution

快哭了/kel

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define INF 0x3f3f3f3f3f3f3f3f
const int N=1e4+10;
struct Edge{
	int u,v,w,c,f;
	Edge(int _u,int _v,int _w,int _c,int _f): u(_u),v(_v),w(_w),c(_c),f(_f){}
};
struct Graph{
	int n,m,s,t;
	vector<Edge> e;
	vector<int> g[N];
	int d[N];
	bool vis[N];
	void clear(int _n,int _m,int _s,int _t){
		n=_n,m=_m,s=_s,t=_t;
		for(int i=1;i<=n;++i) g[i].clear();
		e.clear();
	}
	void add_edge(int u,int v,int c,int w){
		//cout<<u<<" "<<v<<" "<<w<<" "<<c<<endl;
		e.push_back(Edge(u,v,w,c,0));
		e.push_back(Edge(v,u,-w,0,0));
		g[u].push_back(e.size()-2);
		g[v].push_back(e.size()-1);
	}
	bool spfa(){
		memset(vis,0,sizeof(vis));
		memset(d,0x3f,sizeof(d));
		queue<int> q;
		q.push(s);
		d[s]=0;
		vis[s]=1;
		while(!q.empty()){
			int u=q.front();
			q.pop();vis[u]=0;
			for(auto t:g[u]){
				Edge& ed=e[t];
				if(ed.c>ed.f&&d[ed.v]>d[u]+ed.w){
					d[ed.v]=d[u]+ed.w;
					if(!vis[ed.v]){
						vis[ed.v]=1;
						q.push(ed.v);
					}
				}
			}
		}
		return d[t]!=INF;
	}
	ll ret;
	ll DFS(int x,ll a){
		if(x==t||a==0) return a;
		vis[x]=1;
		ll flow=0;
		for(auto t:g[x]){
			Edge& ed=e[t];
			if(!vis[ed.v]&&d[x]+ed.w==d[ed.v]){
				int f=DFS(ed.v,min(a,1ll*(ed.c-ed.f)));
				if(f>0){
					ret+=ed.w*f;
					ed.f+=f;
					e[t^1].f-=f;
					flow+=f;
					a-=f;
					if(a==0) break;
				}
			}
		}
		if(flow==0)
			d[x]=0;
		vis[x]=0;
		return flow;
	}
	ll Dinic(){
		ll flow=0;
		while(spfa()){
			ll tf=0;
			while(1){
				ll f=DFS(s,INF);
				if(f==0) break;
				tf+=f;
			}
			if(tf==0) break;
			flow+=tf;
		}
		return flow;
	}
	void print(){
		cout<<n<<" "<<s<<" "<<t<<endl;
		for(auto p:e){
			printf("%d %d %d %d\n",p.u,p.v,p.c,p.w);
		}
		for(int i=1;i<=n;++i){
			printf("%d: ",i);
			for(auto j:g[i]) printf("%d ",j);
			puts("");
		}
	}
}g;
string s[N];
map<string,int> mp;
bool vis[N];
int n,m;
void dfs1(int u){
	cout<<s[u]<<endl;
	vis[u]=1;
	for(auto ed:g.g[u])
		if(g.e[ed].v>n&&g.e[ed].v<=2*n&&g.e[ed].c==g.e[ed].f){
			dfs1(g.e[ed].v-n);
			break;
		}
}
void dfs2(int u){
	vis[u]=1;
	for(auto ed:g.g[u])
		if(g.e[ed].v>n&&g.e[ed].v<=2*n&&g.e[ed].c==g.e[ed].f&&!vis[g.e[ed].v-n]){
			dfs2(g.e[ed].v-n);
			break;
		}
	cout<<s[u]<<endl;
}
int main(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;++i){
		cin>>s[i];
		mp[s[i]]=i;
	}
	bool check=0;
	int S=n*2+1,T=S+1;
	g.clear(T,-1,S,T);
	for(int i=1;i<=m;++i){
		string s1,s2;
		cin>>s1>>s2;
		int x=mp[s1],y=mp[s2];
		if(x>y) swap(x,y);
		if(x==y) continue;
		if(x==1&&y==n) check=1;
		g.add_edge(x,y+n,1,0);
	}
	g.add_edge(S,n+1,0x3f3f3f3f,0);
	g.add_edge(n,T,0x3f3f3f3f,0);
	for(int i=1;i<=n;++i){
		if(i!=1&&i!=n) g.add_edge(i+n,i,1,-1);
		else g.add_edge(i+n,i,2,-1);
	}
	ll fl=g.Dinic();
	if(fl==2){
		printf("%lld\n",-g.ret-2);
		dfs1(1);
		dfs2(1);
	}
	else if(fl==1&&check){
		printf("%d\n",2);
		cout<<s[1]<<endl<<s[n]<<endl<<s[1]<<endl;
	}
	else puts("No Solution");
    return 0;
}
2023/2/11 10:59
加载中...