Special Fish
Special Fish |
| Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) |
| Total Submission(s): 14 Accepted Submission(s): 9 |
|
Problem Description
There is a kind of special fish in the East Lake where is closed to campus of Wuhan University. It’s hard to say which gender of those fish are, because every fish believes itself as a male, and it may attack one of some other fish who is believed to be female by it.
A fish will spawn after it has been attacked. Each fish can attack one other fish and can only be attacked once. No matter a fish is attacked or not, it can still try to attack another fish which is believed to be female by it. There is a value we assigned to each fish and the spawns that two fish spawned also have a value which can be calculated by XOR operator through the value of its parents. We want to know the maximum possibility of the sum of the spawns. |
|
Input
The input consists of multiply test cases. The first line of each test case contains an integer n (0 < n <= 100), which is the number of the fish. The next line consists of n integers, indicating the value (0 < value <= 100) of each fish. The next n lines, each line contains n integers, represent a 01 matrix. The i-th fish believes the j-th fish is female if and only if the value in row i and column j if 1.
The last test case is followed by a zero, which means the end of the input. |
|
Output
Output the value for each test in a single line.
|
|
Sample Input
3 |
|
Sample Output
6 |
|
Author
momodi@whu
|
|
Source
The 5th Guangting Cup Central China Invitational Programming Contest
|
|
Recommend
notonlysuccess
|
/*
题意:有n条鱼,每条鱼最多只能攻击一次,被攻击一次,一次攻击产生的价值是val[i]^val[j],现在问你在满足条件的情况下能获得的最大价值
是多少。 #初步思路:简化成最小割最大团问题,将0点设置成源点,tol+1设置成汇点,可以想到将一个点拆成两个点,i和i+n分别表示攻击边和被攻击边
然后跑一下 #感悟:刚换了乌版图系统用的调了几天,终于正常的写代码哈哈哈。
*/
#include<bits/stdc++.h>
using namespace std;
int val[];//用来存储每个鱼的价值
int n;
char mapn[][];//用来存储攻击关系
int tol=;//要是总的可能的点数
/****************************************最小割最大流模板****************************************/
#define INF 1e9
using namespace std;
const int maxn=+; struct Edge
{
int from,to,cap,flow,cost;
Edge(){}
Edge(int f,int t,int c,int fl,int co):from(f),to(t),cap(c),flow(fl),cost(co){}
}; struct MCMF
{
int n,m,s,t;
vector<Edge> edges;
vector<int> G[maxn];
bool inq[maxn];
int d[maxn];
int p[maxn];
int a[maxn]; void init(int n,int s,int t)
{
this->n=n, this->s=s, this->t=t;
edges.clear();
for(int i=;i<n;++i) G[i].clear();
} void AddEdge(int from,int to,int cap,int cost)
{
edges.push_back(Edge(from,to,cap,,cost));
edges.push_back(Edge(to,from,,,-cost));
m=edges.size();
G[from].push_back(m-);
G[to].push_back(m-);
} bool BellmanFord(int &flow, int &cost)
{
for(int i=;i<n;++i) d[i]=INF;
memset(inq,,sizeof(inq));
d[s]=, a[s]=INF, inq[s]=true, p[s]=;
queue<int> Q;
Q.push(s);
while(!Q.empty())
{
int u=Q.front(); Q.pop();
inq[u]=false;
for(int i=;i<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]=true; }
}
}
}
if(d[t]==INF) return false;
flow +=a[t];
cost +=a[t]*d[t];
int u=t;
while(u!=s)
{
edges[p[u]].flow += a[t];
edges[p[u]^].flow -=a[t];
u = edges[p[u]].from;
}
return true;
} int Min_cost()
{
int flow=,cost=;
while(BellmanFord(flow,cost));
//cout<<flow<<" "<<cost<<endl;
return cost;
}
}MM;
/****************************************最小割最大流模板****************************************/
void build(){//建边
tol=n*+;//总的可能的点数
MM.init(tol+,,tol);
//cout<<n<<endl;
//cout<<tol<<endl;
for(int i=;i<n;i++){
MM.AddEdge(,i+,,);
MM.AddEdge(i+,tol,,);
MM.AddEdge(i++n,tol,,);
for(int j=;j<n;j++){
if(mapn[i][j]==''){//这两个能打起来
MM.AddEdge(i+,j+n+,,-(val[i]^val[j]));
//cout<<-(val[i]^val[j])<<endl;
}
//cout<<j<<endl;
}
} }
int main(){
//freopen("in.txt","r",stdin);
while(scanf("%d",&n)!=EOF&&n){
for(int i=;i<n;i++){
scanf("%d",&val[i]);
} for(int i=;i<n;i++){
scanf("%s",mapn[i]);
}
//for(int i=0;i<n;i++){
// for(int j=0;j<n;j++){
// cout<<mapn[i][j]<<" ";
// }
// cout<<endl;
//}
build();
//cout<<"ok"<<endl;
printf("%d\n",-MM.Min_cost()); }
return ;
}
Special Fish的更多相关文章
- [ACM] HDU 3395 Special Fish (最大重量二分图匹配,KM算法)
Special Fish Problem Description There is a kind of special fish in the East Lake where is closed to ...
- HDU 3395 Special Fish(拆点+最大费用最大流)
Special Fish Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tot ...
- HDU3395 Special Fish(最大费用任意流)
题目要的并不是最大匹配下得到的最大的结果. 网上流行的做法是加边.其实,在连续增广的时候求得一个可行流的总费用为负就停止这样就行了. #include<cstdio> #include&l ...
- HDU 3395 Special Fish 最“大”费用最大流
求最大费用能够将边权取负以转化成求最小费用. 然而此时依旧不正确.由于会优先寻找最大流.可是答案并不一定出如今满流的时候.所以要加一些边(下图中的红边)使其在答案出现时满流. 设全部边的流量为1,花费 ...
- 【转】KM匹配题集
转自:http://blog.csdn.net/shahdza/article/details/7779324 [HDU]2255 奔小康赚大钱 模板题★1533 Going Home 模板题★242 ...
- 【转载】图论 500题——主要为hdu/poj/zoj
转自——http://blog.csdn.net/qwe20060514/article/details/8112550 =============================以下是最小生成树+并 ...
- Soj题目分类
-----------------------------最优化问题------------------------------------- ----------------------常规动态规划 ...
- 【HDOJ图论题集】【转】
=============================以下是最小生成树+并查集====================================== [HDU] How Many Table ...
- hdu 3395(KM算法||最小费用最大流(第二种超级巧妙))
Special Fish Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tota ...
随机推荐
- Codeforce 854 A. Fraction
A. Fraction time limit per test 1 second memory limit per test 512 megabytes input standard input ou ...
- AF_INET
AF_INET(又称PF_INET)是 IPv4 网络协议的套接字类型,AF_INET6 则是 IPv6 的:而AF_UNIX 则是Unix系统本地通信. 选择AF_INET 的目的就是使用IPv4 ...
- js的严格模式详解
什么是js的严格模式? 严格模式指的是使js在更为严格的条件下运行.严格模式的主要作用是规范我们写代码习惯,以及为js升级做好铺垫. 如何使用严格模式? <script> //直接在代码 ...
- HDFS 分布式写入问题 AlreadyBeingCreatedException
进行追加文件时出现AlreadyBeingCreatedException错误 堆栈信息大致如下: org.apache.hadoop.ipc.RemoteException(org.apache.h ...
- .NET十年回顾
一. 引子 从我还是编程菜鸟时起,.NET就从来没让我失望过.总是惊喜不断. 当年我第一个项目是做个进销存.用的Winform.当时我是机电工程师.编程只是业余心血来潮而已. .NET的低门槛.V ...
- BZOJ-1010-[HNOI2008]玩具装箱toy(斜率优化)
Description P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊的一维容器中.P教授有编号为1... ...
- cookie存储中文
写cookie Cookie chineseCookie = new Cookie( "chineseCookie ", URLEncoder. ...
- 大数据算法设计模式(1) - topN spark实现
topN算法,spark实现 package com.kangaroo.studio.algorithms.topn; import org.apache.spark.api.java.JavaPai ...
- oracle temporary table
oralce 有两种临时表 a.会话级临时表 b.事物级临时表 A.事物级临时表 语法 create global temporary table table_name( col1 type1, ...
- nginx URL重写
html { font-family: sans-serif } body { margin: 0 } article,aside,details,figcaption,figure,footer,h ...