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 |
求修正...#include<algorithm> #include<iostream> using namespace std; const int INF= (1<<30); const int MAX=30; struct point{ int w,d; }; struct Node{ int id,flow; Node*next; }; Nodenode[MAX*MAX],edge[MAX*MAX*MAX],*mat[MAX*MAX]; point p[MAX]; int ma[MAX][MAX],Q[MAX*MAX],pre[MAX*MAX]; bool vis[MAX*MAX]; int N,edge_n,S,T; inline int Min(int a,int b){ return a<b?a:b; } void init(){ edge_n=0; for(int i=0;i<=T;i++) node[i].next=NULL; } void add(int fr,int to,int flow){ edge[edge_n].id=to; edge[edge_n].flow=flow; edge[edge_n].next=node[fr].next; node[fr].next=&edge[edge_n]; edge_n++; edge[edge_n].id=fr; edge[edge_n].flow=0; edge[edge_n].next=node[to].next; node[to].next=&edge[edge_n]; edge_n++; } Node*reverse(Node*pp){ return edge+((pp-edge)^1); } bool findpath(){ memset(vis,false,sizeof(vis)); int fr=0,re=1; vis[S]=true; while(fr<re){ int v=Q[fr++]; for(Node*cur=node[v].next;cur;cur=cur->next){ int id=cur->id; if(cur->flow<=0) continue; if(!vis[id]){ vis[id]=true; Q[re++]=id; pre[id]=v; mat[id]=cur; if(id==T)return true; } } } return false; } int maxflow(){ int ans=0; while(findpath()){ int j=T,now=INF; while(j!=S){ now=Min(now,mat[j]->flow); j=pre[j]; } ans+=now; j=T; while(j!=S){ mat[j]->flow-=now; reverse(mat[j])->flow+=now; j=pre[j]; } } return ans; } bool check(int id){ init(); int m[MAX][MAX]; S =0,T= N+300+1; int tmp= p[id].w; for(int i=1;i<=N;i++) for(int j=1;j<=N;j++) m[i][j]=ma[i][j]; for(i=1;i<=N;i++) if(m[id][i]){ tmp+=m[id][i]; m[id][i]=m[i][id]=0; } int num=0,cur=0; for(i=1;i<=N;i++){ for(int j=i+1;j<=N;j++){ if(m[i][j]){ num++; cur+=m[i][j]; add(S,num,ma[i][j]); add(num,300+i,m[i][j]); add(num,300+j,m[i][j]); } } if(tmp<p[i].w) return false; if(tmp>p[i].w) add(i+300,T,tmp- p[i].w); } return cur==maxflow(); } void readIn(){ scanf("%d",&N); for(int i=1;i<=N;i++) scanf("%d%d",&p[i].w,&p[i].d); for(i=1;i<=N;i++) for(int j=1;j<=N;j++) scanf("%d",&ma[i][j]); return; } void Solve(){ bool flag=true; for(int i=1;i<=N;i++){ if(check(i)){ if(flag) printf("%d",i); else printf(" %d",i); flag=false; } } printf("\n"); return; } int main(){ int Cas; scanf("%d",&Cas); while(Cas--){ readIn(); Solve(); } } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator