2015暑假训练赛个人赛(7.31)
2015-07-31 19:39
441 查看
ID | Origin | Title | ||
---|---|---|---|---|
#include <cstdio> #include <vector> #include <cstring> #include <queue> using namespace std; const int maxv = 1e+4; const int maxe = 1e+6;; const long long INF = 0x3f3f3f3f; struct Edge { int from, to, cap, flow, cost; Edge() {} Edge(int from, int to, int cap, int flow, int cost) { this->from = from; this->to = to; this->cap = cap; this->flow = flow; this->cost = cost; } }; struct MCMF { int n, m, s, t; vector<Edge> edges; vector<int> G[maxv]; int inq[maxe]; int d[maxe]; int p[maxe]; int a[maxe]; void init(int n) { this -> n = n; for (int i = 0; i < n; i++) G[i].clear(); edges.clear(); } void AddEdge(int from, int to, int cap, int cost) { edges.push_back(Edge(from, to, cap, 0, cost)); edges.push_back(Edge(to, from, 0, 0, -cost)); m = edges.size(); G[from].push_back(m-2); G[to].push_back(m-1); } bool BellmanFord(int s, int t, int &flow, int &cost) { for (int i = 0; i < n; i++) d[i] = INF; memset(inq, 0, sizeof(inq)); d[s] = 0; inq[s] = 1; p[s] = 0; a[s] = INF; queue<int>Q; Q.push(s); while (!Q.empty()) { int u = Q.front(); Q.pop(); inq[u] = 0; for (int i = 0; i < (int)G[u].size(); i++) { Edge &e = edges[G[u][i]]; if (e.cap > e.flow && d[e.to] > d[u] + e.cost) { d[e.to] = d[u] + e.cost; p[e.to] = G[u][i]; a[e.to] = min(a[u], e.cap - e.flow); if (!inq[e.to]) {Q.push(e.to); inq[e.to] = 1;} } } } if (d[t] == INF) return false; flow += a[t]; cost += d[t] * a[t]; int u = t; while (u != s) { edges[p[u]].flow += a[t]; edges[p[u]^1].flow -= a[t]; u = edges[p[u]].from; } return true; } int Mincost (int s, int t) { int flow = 0, cost = 0; while (BellmanFord(s, t, flow, cost)); return flow; } }G; char S[1000], tep[10]; int vis[26+10], num[26+10]; int main() { int t; freopen("in.txt", "r", stdin); scanf("%d", &t); while (t--) { scanf("%s", S); int lenS = strlen(S); int s = lenS+26, t = lenS + 27; G.init(t+2); memset(num, 0, sizeof(num)); for (int i = 0; i < lenS; i++) { num[S[i] - 'a']++; G.AddEdge(s, i, 1, 0); } for (int i = 0 ; i < lenS; i++) { scanf("%s", tep); int lentep = strlen(tep); memset(vis, 0, sizeof(vis)); for (int j = 0; j < lentep; j++) { vis[tep[j] - 'a']++; } for (int j = 0; j < 26; j++) { if (vis[j]) { G.AddEdge(i, lenS+j, vis[j], 10*i + 1000*j); } } } for (int i = 0; i < 26; i++) { G.AddEdge(lenS+i, t, num[i], 0); } if (G.Mincost(s, t) < lenS) { puts("NO SOLUTION"); } else { for (int i = 0; i < (int)G.edges.size(); i += 2) { int u = G.edges[i].from; int v = G.edges[i].to; int flow = G.edges[i].flow; int cost = G.edges[i].cost; int cap = G.edges[i].cap; //printf("%d %d (%d %d) %d\n", u, v, flow, cap, cost); if (lenS <= v && v < lenS + 26 && flow > 0) printf("%c", 'a' + v - lenS); } puts(""); } } return 0; } View Code 相关文章推荐
|