1 条题解

  • 0
    @ 2026-2-7 18:45:37
    #include<bits/stdc++.h>
    using namespace std;
    typedef long long LL;
    const int N = 210;
    const LL INF = 0x3f3f3f3f3f3f3f3fll;
    struct edge
    {
    	LL x,cap,cost,rev;
    };
    vector<edge> e[N];
    int n,m,s,t;
    bool st[N];
    LL d[N];
    int it[N];
    void add(int a,int b,LL c,LL d)
    {
    	e[a].push_back({b,c,d,(LL)e[b].size()});
    	e[b].push_back({a,0,-d,(LL)e[a].size() - 1});
    }
    void spfa()
    {
    	memset(d,0x3f,sizeof d);
    	queue<int> q;
    	d[s] = 0;
    	q.push(s);
    	st[s] = 1;
    	while(!q.empty())
    	{
    		int u = q.front();
    		q.pop();
    		st[u] = 0;
    		for(auto t : e[u])
    			if(t.cap > 0 && d[t.x] > d[u] + t.cost)
    			{
    				d[t.x] = d[u] + t.cost;
    				if(!st[t.x]) q.push(t.x),st[t.x] = 1;
    			}
    	}
    }
    LL res;
    LL dfs(int u,LL f)
    {
    	if(u == t) return f;
    	st[u] = 1;
    	for(int &i = it[u]; i < e[u].size(); i ++)
    	{
    		edge &t = e[u][i]; 
    		if(!st[t.x] && d[u] + t.cost == d[t.x] && t.cap > 0)
    		{
    			LL d = dfs(t.x,min(f,t.cap));
    			if(d > 0)
    			{
    				t.cap -= d;
    				e[t.x][t.rev].cap += d;
    				res += d * t.cost;
    				st[u] = 0;
    				return d;
    			}
    		}
    	}
    	st[u] = 0; 
    	return 0;
    }
    LL dinic() 
    {
    	LL flow = 0;
    	while(1)
    	{
    		spfa();
    		if(d[t] == INF) break;
    		memset(it,0,sizeof it);
    		LL d = dfs(s,1e18);
    		while(d > 0)
    		{
    			flow += d;
    			d = dfs(s,1e18);
    		}
    	}
    	return flow;
    }
    string str[N];
    unordered_map<string,int> mp;
    void dfs1(int u)
    {
    	cout<<str[u]<<endl;
    	st[u] = 1;
    	for(auto &x : e[u])
    	{
    		if(x.x > n && x.x <= 2 * n && x.cap == 0)
    		{
    			dfs1(x.x - n);
    			return;
    		}
    	}
    }
    void dfs2(int u)
    {
    	st[u] = 1;
    	for(auto &x : e[u])
    	{
    		if(x.x > n && x.x <= 2 * n && x.cap == 0 && !st[x.x - n])
    		{
    			dfs2(x.x - n);
    		}
    	}
    	cout<<str[u]<<endl;
    }
    int main()
    {
    	ios::sync_with_stdio(false);
    	cin.tie(0);
    	cin>>n>>m;
    	s = 0,t = 2 * n + 1;
    	bool flag = 0;
    	for(int i = 1; i <= n; i ++)
    	{
    		cin>>str[i];
    		mp[str[i]] = i;
    		if(i != 1 && i != n) add(i + n,i,1,-1);
    		else add(i + n,i,2,-1);
    	}
    	for(int i = 1; i <= m; i ++)
    	{
    		string x,y;
    		cin>>x>>y;
    		int a = mp[x],b = mp[y];
    		if(a > b) swap(a,b);
    		flag |= (a == 1 && b == n);
    		add(a,b + n,1,0);
    	}
    	add(s,n + 1,1e9,0);
    	add(n,t,1e9,0);
    	LL f = dinic();
    	if(f == 1 && flag)
    	{
    		cout<<2<<endl<<str[1]<<endl<<str[n]<<endl<<str[1]<<endl;
    		return 0;
    	}
    	if(f != 2)
    	{
    		cout<<"No Solution!\n";
    		return 0;
    	}
    	cout<<- res - 2<<endl;
    	dfs1(1);
    	dfs2(1);
    	return 0;
    }
    
    • 1

    信息

    ID
    962
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    9
    已通过
    3
    上传者