您的位置:首页 > 其它

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: