1 条题解
-
0
#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
- 上传者