传送门:
http://www.lydsy.com/JudgeOnline/problem.php?id=2768
http://www.lydsy.com/JudgeOnline/problem.php?id=1934
http://www.lydsy.com/JudgeOnline/problem.php?id=3130
http://www.lydsy.com/JudgeOnline/problem.php?id=1070
最近不愿意写题解……看看代码吧
2768 1934 一模一样
Code:
/*
ID:zky
OJ:BZOJ
Index:2768
Language:C++
*/
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int w[301][301];
int a[301];
int n,m;
int vis[301];
int Link[302];
bool find(int x){
for(int i=1;i<=n;i++){
if(w[x][i]&&!vis[i]){
vis[i]=1;
if(!Link[i]||find(Link[i])){
Link[i]=x;
return true;
}
}
}
return false;
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++)cin>>a[i];
for(int i=1;i<=m;i++){
int Alice,Bob;
cin>>Alice>>Bob;
if(a[Alice]^a[Bob])w[Alice][Bob]=w[Bob][Alice]=1;
}
int ans=0;
for(int i=1;i<=n;i++){
memset(vis,0,sizeof(vis));
if(find(i))ans++;
}
cout<<ans/2<<endl;
return 0;
}
/*
ID:zky
OJ:BZOJ
Index:3130
Language:C++
*/
#include<vector>
#include<queue>
#include<iomanip>
#include<cstdio>
#include<climits>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
#define read(x) scanf("%d",&x)
using namespace std;
int n,m,p;
const int INF=INT_MAX;
struct edge{
int u,v;
double cap,flow;
edge(int _u,int _v,double _cap):
u(_u),v(_v),cap(_cap){flow=0;}
};
vector<edge>edges;
vector<vector<int> >G;
void add(int u,int v,double cap){
edges.push_back(edge(u,v,cap));
G[u].push_back(edges.size()-1);
}
int d[101];
int vis[101];
int cur[101];
double l=0,r=0,mid=INT_MAX,maxx;
bool bfs(){
memset(vis,0,sizeof(vis));
queue<int>q;
q.push(1);
d[1]=0;
vis[1]=1;
while(!q.empty()){
int u=q.front();q.pop();
for(int i=0;i<G[u].size();i++){
edge &e=edges[G[u][i]];
if(min(mid,e.cap)>e.flow&&!vis[e.v]){
d[e.v]=d[u]+1;
vis[e.v]=1;
q.push(e.v);
}
}
}
return vis[n];
}
const double eps=1e-6;
double dfs(int x,double a){
if(x==n||fabs(a)<eps)return a;
double flow=0,f;
for(int &i=cur[x];i<G[x].size();i++){
edge &e=edges[G[x][i]];
if(d[e.v]==d[x]+1&&(f=dfs(e.v,min(a,min(mid,e.cap)-e.flow)))>0){
e.flow+=f;
edges[G[x][i]^1].flow-=f;
flow+=f;
a-=f;
if(a==0)break;
}
}
return flow;
}
double Dinic(){
double flow=0;
while(bfs()){
double x=0;
memset(cur,0,sizeof(cur));
while(x=dfs(1,INF)){
flow+=x;
memset(cur,0,sizeof(cur));
}
}
return flow;
}
bool ok(){
for(int i=0;i<edges.size();i++)
edges[i].flow=0;
if(fabs(Dinic()-maxx)<eps)return true;
return false;
}
int main(){
read(n);read(m);read(p);
G.resize(n+10);
while(m--){
int u,v,cap;
read(u);read(v);read(cap);
add(u,v,cap);
add(v,u,0);
r=max(r,(double)cap);
}
r++;
maxx=Dinic();
cout<<fixed<<setprecision(0)<<maxx<<endl;
while(fabs(l-r)>eps){
mid=(l+r)/2.0;
if(ok())
r=mid;
else
l=mid;
}
cout<<fixed<<setprecision(4)<<(double)p*l<<endl;
return 0;
}
/*
ID:zky
OJ:BZOJ
Index:1070
Language:C++
*/
#include<queue>
#include<vector>
#include<cstdio>
#include<cstring>
#include<climits>
#include<iomanip>
#include<iostream>
#include<algorithm>
#define clear(x) memset(x,0,sizeof(x))
#define inf(x) memset(x,0x7f,sizeof(x))
#define Size G[u].size()
#define read3(x,y,z) scanf("%d%d%d",&x,&y,&z)
#define read4(x,y,z,w) scanf("%d%d%d%d",&x,&y,&z,&w)
using namespace std;
int s,t;
int n,m,k;
const int INF=INT_MAX;
struct edge{
int u,v,cap,flow,cost;
};
vector<edge>edges;
vector<vector<int> >G;
int d[1001];
int cur[1001];
int vis[1001];
int prev[1001];
void add(int u,int v,int cap,int cost){
edges.push_back((edge){u,v,cap,0,cost});
G[u].push_back(edges.size()-1);
}
int a[1001];
bool spfa(int &flow,int &cost){
queue<int>q;
q.push(s);
memset(d,0x7f,sizeof(d));
memset(vis,0,sizeof(vis));
int B=d[0];
d[s]=0;
vis[s]=1;
a[s]=INF;
while(!q.empty()){
int u=q.front();q.pop();vis[u]=0;
for(int i=0;i<G[u].size();i++){
edge &e=edges[G[u][i]];
if(e.cap-e.flow>0&&d[e.v]>d[u]+e.cost){
d[e.v]=d[u]+e.cost;
prev[e.v]=G[u][i];
a[e.v]=min(a[u],e.cap-e.flow);
if(!vis[e.v]){
vis[e.v]=1;
q.push(e.v);
}
}
}
}
if(d[t]==B)return false;
int u=t;
flow+=a[t];
cost+=a[t]*d[t];
while(u!=s){
edges[prev[u]].flow+=a[t];
edges[prev[u]^1].flow-=a[t];
u=edges[prev[u]].u;
}
return true;
}
void costflow(){
int flow=0,cost=0;
while(spfa(flow,cost));
cout<<fixed<<setprecision(2)<<(double)cost/n<<endl;
}
int map[61][61];
int main(){
cin>>m>>n;
G.resize(n*m+n+100);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++){
cin>>map[i][j];
}
s=0;t=n+n*m+1;
for(int i=1;i<=n;i++){
add(s,i,1,0);
add(i,s,0,0);
}
int T=n;
for(int i=1;i<=m;i++)
for(int j=1;j<=n;j++){
add(++T,t,1,0);
add(t,T,0,0);
for(int k=1;k<=n;k++){
add(k,T,1,map[k][i]*j);
add(T,k,0,-map[k][i]*j);
}
}
costflow();
return 0;
}