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,附代码# include <iostream> using namespace std; # include <set> # include <queue> # include <string> # define MAXNUM 99999999 struct point { string str; int id; }; class cmp { public: bool operator()(const point &a,const point &b) const { return a.str<b.str; } }; class link { public: int c,f; bool used; link() { used=0; f=0; } }; set<point,cmp> refer; link g[800][800]; int vn=0,an=0,c=0,cn,list[1000]; void dfs(int pos,int level[]) { if(pos==c) { list[level[pos]]=pos; int min=MAXNUM; for(int i=1;i<level[pos];i++) { if(g[list[i]][list[i+1]].c&&g[list[i]][list[i+1]].c-g[list[i]][list[i+1]].f<min) min=g[list[i]][list[i+1]].c-g[list[i]][list[i+1]].f; else if(!g[list[i]][list[i+1]].c&&g[list[i]][list[i+1]].f<min) min=g[list[i]][list[i+1]].f; } for(int i=1;i<level[pos];i++) { if(g[list[i]][list[i+1]].c) g[list[i]][list[i+1]].f+=min; else g[list[i]][list[i+1]].f-=min; } } else { list[level[pos]]=pos; for(int i=1;i<=c;i++) { if(g[pos][i].used&&level[i]==level[pos]+1&&((g[pos][i].c&&g[pos][i].c-g[pos][i].f>0)||(!g[pos][i].c&&g[pos][i].f))) { dfs(i,level); } } } } void makelevel(int level[]) { queue<int> q; level[c-1]=1; q.push(c-1); while(!q.empty()) { int pos=q.front(); q.pop(); if(pos==c) break; for(int i=1;i<=c;i++) if(g[pos][i].used&&(!level[i]||level[i]>level[pos]+1)&&((g[pos][i].c&&g[pos][i].c-g[pos][i].f>0)||(!g[pos][i].c&&g[pos][i].f))) { level[i]=level[pos]+1; q.push(i); } } } int maxflow()//dicnic max-flow algorithm { int level[800]; memset(level,0,sizeof(level)); makelevel(level); while(level[c]) { dfs(c-1,level); memset(level,0,sizeof(level)); makelevel(level); } int total=0; for(int i=1;i<=c;i++) if(g[c-1][i].used) total+=g[c-1][i].f; return total; } inline void add(int s,int e,int limit) { g[s][e].c=limit; g[s][e].f=0; g[e][s].f=0; g[e][s].c=0; g[s][e].used=g[e][s].used=1; } int main() { cin>>vn; int vnum[101]; memset(vnum,0,sizeof(vnum)); for(int i=1;i<=vn;i++) { point temp; cin>>temp.str; set<point,cmp>::iterator it=refer.find(temp); if(it==refer.end()) { temp.id=++c; refer.insert(temp); vnum[c]++; } else //去重 { vn--; i--; vnum[it->id]++; } } string t1[101],t2[101]; cin>>an; int total=an; int anum[101]; memset(anum,0,sizeof(anum)); for(int i=1;i<=an;i++) { cin>>t1[i]>>t2[i]; point temp; temp.str=t1[i]; set<point,cmp>::iterator it=refer.find(temp); if(it==refer.end()) { temp.id=++c; refer.insert(temp); anum[c-vn]++; } else { anum[it->id-vn]++; i--; an--; } } for(int i=1;i<=an;i++) { int s=vn+i,e; point temp; temp.str=t2[i]; set<point,cmp>::iterator it=refer.find(temp); if(it==refer.end()) { temp.id=++c; e=c; refer.insert(temp); } else e=it->id; add(s,e,MAXNUM); } cin>>cn; for(int i=1;i<=cn;i++) { point temp1,temp2; int s,e; cin>>temp1.str>>temp2.str; set<point,cmp>::iterator it1=refer.find(temp1),it2=refer.find(temp2); if(it1==refer.end()) { temp1.id=++c; s=c; refer.insert(temp1); } else s=it1->id; if(it2==refer.end()) { temp2.id=++c; e=c; refer.insert(temp2); } else e=it2->id; add(s,e,MAXNUM); } c++; for(int i=vn+1;i<=vn+an;i++) { add(c,i,anum[i-vn]); } c++; for(int i=1;i<=vn;i++) { add(i,c,vnum[i]); } cout<<total-maxflow()<<endl; return 0; } Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator