| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
wa了五发,分享一下AC过程中的一些wa点(带数据)1.没有拆点
2 5
30 0 0 0 1
40 0 0 0 1
1 2 1 1 0
50 1 0 1 1
60 1 0 1 1
ans:1 2
2.当机器的一个输入性能点是1,可以与这台机器连线的合法机器对应的输出性能点必须是0
3 2
100 0 0 0 1 1 0
100 0 1 0 1 1 1
ans:0 0
3.本人还写非常了弱智的代码:while(scanf("%d%d",&qn,&n)!=EOF)
开始没写成while(scanf("%d%d",&qn,&n)),结果输出超限 QAQ
AC代码:0ms 740k
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
const int N=55;
const int M=N*N;
const int INF=0x3f3f3f3f;
struct mac{
int q;
int in[10],out[10];
}m[N];
struct edge{
int v,next,c;
}e[M];
int p[2*N],eid;
int n,qn,g[2*N][2*N],cnt;
void add(int u,int v,int c){
e[eid]={v,p[u],c}; p[u]=eid++;
e[eid]={u,p[v],0}; p[v]=eid++;
}
int d[N],s,t;
bool bfs(){
memset(d,-1,sizeof(d));
queue<int> q;
q.push(s); d[s]=0;
while(!q.empty()){
int u=q.front(); q.pop();
for(int i=p[u];~i;i=e[i].next){
int v=e[i].v;
if(e[i].c>0&&d[v]==-1){
d[v]=d[u]+1;
q.push(v);
}
}
}
return d[t]!=-1;
}
int dfs(int u,int flow){
if(u==t)return flow;
int res=0;
for(int i=p[u];~i;i=e[i].next){
int v=e[i].v;
if(e[i].c>0&&d[v]==d[u]+1){
int tmp=dfs(v,min(e[i].c,flow));
if(u!=s&&v!=t&&u>n&&v<=n&&tmp){
if(g[u-n][v]==0) cnt++;
g[u-n][v]+=tmp;
}
res+=tmp;
flow-=tmp;
e[i].c-=tmp;
e[i^1].c+=tmp;
if(!flow)break;
}
}
if(!res) d[u]=-1;
return res;
}
int main(){
while(scanf("%d%d",&qn,&n)!=EOF){
s=0,t=2*n+1;
memset(p,-1,sizeof(p)); eid=0;
memset(g,0,sizeof(g)); cnt=0;
int flag;
for(int i=1;i<=n;++i){
scanf("%d",&m[i].q);
for(int j=0;j<qn;++j)scanf("%d",&m[i].in[j]);
for(int j=0;j<qn;++j)scanf("%d",&m[i].out[j]);
}
for(int i=1;i<=n;++i)
add(i,i+n,m[i].q);
for(int i=1;i<=n;++i){
int k;
for(k=0;k<qn;++k)
if(m[i].in[k]==1)break;
if(k==qn) add(s,i,m[i].q);
for(k=0;k<qn;++k)
if(m[i].out[k]==0)break;
if(k==qn) {
add(i+n,t,m[i].q);
continue;
}
for(int j=1;j<=n;++j){
if(i==j)continue;
flag=0;
for(k=0;k<qn;++k){
if(m[j].in[k]&&m[i].out[k]){
flag=1;
}else if(m[j].in[k]==1&&!m[i].out[k]||m[j].in[k]==0&&m[i].out[k]){
flag=0;
break;
}
}
if(flag) add(i+n,j,m[i].q);
}
}
int ans=0;
while(bfs()) {
ans+=dfs(s,INF);
// cout<<ans<<endl;
}
printf("%d %d\n",ans,cnt);
for(int i=1;i<=n;++i){
for(int j=1;j<=n;++j){
if(i==j)continue;
if(g[i][j])printf("%d %d %d\n",i,j,g[i][j]);
}
}
}
return 0;
}
Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator