HDU1528Card Game Cheater(最大匹配)

题意:给出 Adam和Eva二人的牌,游戏规则是,每个人轮流每次选择出一张牌,牌的数字大的赢,如果,数字一样按牌的花色H>S>D>C决定谁赢。 思路:按照牌的大小关系,建立二分图的A,B两个集合,,EVA大于Adam的牌,就连上边。

;const int maxn=505;const int inf=999999;int x[maxn],y[maxn];void read_x(int n){//读入for(int i=0;i<n;i++){char op[3];scanf(“%s”,op);int num=0;if(op[0]>=’2’&&op[0]<=’9′)num=op[0]-‘0′;else if(op[0]==’T’)num=10;else if(op[0]==’J’)num=11;else if(op[0]==’Q’)num=12;else if(op[0]==’K’)num=13;elsenum=14;if(op[1]==’H’)num=num*10+4;else if(op[1]==’S’)num=num*10+3;else if(op[1]==’D’)num=num*10+2;elsenum=num*10+1;x[i]=num;}}void read_y(int n){for(int i=0;i<n;i++){char op[3];scanf(“%s”,op);int num=0;if(op[0]>=’2’&&op[0]<=’9′)num=op[0]-‘0′;else if(op[0]==’T’)num=10;else if(op[0]==’J’)num=11;else if(op[0]==’Q’)num=12;else if(op[0]==’K’)num=13;elsenum=14;if(op[1]==’H’)num=num*10+4;else if(op[1]==’S’)num=num*10+3;else if(op[1]==’D’)num=num*10+2;elsenum=num*10+1;y[i]=num;}reverse(y,y+n);}vector<int> G[maxn];void build_map(int n){for(int i=0;i<n;i++){// printf(“x = %d,y = %d\n”,x[i],y[i]);for(int j=0;j<n;j++)if(x[i]<=y[j]){G[i].pb(j);//满足关系,连上边}}}int matching[maxn];bool vis[maxn];int num;bool dfs(int u){int N=G[u].size();for(int i=0;i<N;i++){int v=G[u][i];if(vis[v])continue;vis[v]=true;if(matching[v]==-1||dfs(matching[v])){matching[v]=u;return true;}}return false;}int hungar(){int ans=0;cl(matching,-1);for(int i=0;i<num;i++){cl(vis,false);if(dfs(i))ans++;}return ans;}int main(){int T;scanf(“%d”,&T);while(T–){int n;scanf(“%d”,&n);for(int i=0;i<maxn;i++)G[i].clear();read_x(n);read_y(n);build_map(n);num=n;int ans=hungar();printf(“%d\n”,ans);}return 0;}

君子无故,玉不去身。

HDU1528Card Game Cheater(最大匹配)

相关文章:

你感兴趣的文章:

标签云: