提交一组hack数据
查看原帖
提交一组hack数据
540402
rbjwnb楼主2023/4/10 22:17

以下是AC代码和hack数据

hack数据:

输入:

4 3
a
b
c
d
a b
b c
c d

错误输出:

4
a
b
c
d
a

实际输出:

No Solution!
#include<bits/stdc++.h>
#define endl '\n'
using namespace std;
typedef long long LL;
typedef pair<int, int> PII;
const int N = 1e6+5, M = 1e6+5;
const int MOD = 998244353, INF = 0x3f3f3f3f;
int S, T;
int h[N], e[M], f[M], w[M], ne[M], idx;
int d[N], pre[N], incf[N];
bool st[N];
void add(int a, int b, int c, int d) {
	e[idx] = b, f[idx] = c, w[idx] = d, ne[idx] = h[a], h[a] = idx ++;
	e[idx] = a, f[idx] = 0, w[idx] = -d, ne[idx] = h[b], h[b] = idx ++;
}
bool spfa() {
	memset(d, 0x3f, sizeof d);
	memset(incf, 0, sizeof incf);
	queue<int> q;
	q.push(S), d[S] = 0, incf[S] = INF;
	while(q.size()) {
		int t = q.front();
		q.pop();
		st[t] = false;

		for(int i = h[t]; ~i; i = ne[i]) {
			int j = e[i];
			if(f[i] && d[j] > d[t] + w[i]) {
				d[j] = d[t] + w[i];
				pre[j] = i;
				incf[j] = min(f[i], incf[t]);
				if(!st[j]) {
					q.push(j);
					st[j] = true;
				}
			}
		}
	}
	return incf[T] > 0;
}
void EK(int &flow, int &cost) {
	flow = cost = 0;
	while(spfa()) {
		int t = incf[T];
		flow += t, cost += t * d[T];
		for(int i = T; i != S; i = e[pre[i]^1]) {
			f[pre[i]] -= t;
			f[pre[i] ^ 1] += t;
		}
	}
}

int n, m;
string name[N];
map<string, int> mp;
vector<int> ans;
bool vis[N];
void dfs(int u) {
	ans.push_back(u - n);
	vis[u - n] = true;
	if(u == n + n) return ;
	for(int i = h[u]; ~i; i = ne[i]) {
		int v = e[i];
		if(f[i ^ 1] && !vis[v]) {
			dfs(v + n);
			break;
		}
	}
}
void solve() {
	memset(h, -1, sizeof h);
	cin >> n >> m;
	S = 0, T = n + n + 1;
	add(S, 1, 2, 0);
	add(n + n, T, 2, 0);
	for(int i = 1; i <= n; i ++) {
		cin >> name[i];
		mp[name[i]] = i;
		if(i != 1 && i != n) add(i, i + n, 1, -1);
		else add(i, i + n, 2, -1);
	}
	string s, t;
	int u, v;
	for(int i = 1; i <= m; i ++) {
		cin >> s >> t;
		u = mp[s], v = mp[t];
		add(u + n, v, 1, 0);
	}
	int flow, cost;
	EK(flow, cost);
	if(flow == 0) {
		cout << "No Solution!\n";
		return ;
	}
	cout << -cost-2*(flow-1) << endl;
   //就是说没有flow=1时输出NoSoultion的数据,只有一个很特殊的可以正常输出的a -> c -> a的数据。
	dfs(1 + n);
	for(int i = 0; i < ans.size(); i ++)
		cout << name[ans[i]] << endl;
	ans.clear();
	dfs(1 + n);
	for(int i = ans.size() - 1; i >= 0; i --)
		cout << name[ans[i]] << endl;
}

int main() {
	//ios::sync_with_stdio(false);
	//cin.tie(nullptr), cout.tie(nullptr);
	int t = 1;
	//cin >> t;
	while(t --) solve();
	
	return 0;
}
2023/4/10 22:17
加载中...