HDU1845 Jimmy’s Assignment 984ms 飘过啊 汗死 二分匹配最大匹配数
2013-10-22 21:23
585 查看
984ms飘过,这题目真是笑死我了,不知道是不是题目数据水的问题,不过按了计算器大致估计了一下,觉得不是数据问题,其实就是卡过去的,纯属看人品的 代码,使用了邻接表,更快点,这道题目 他的匹配点 是自己的,所以以前 那个标记 点是否被连过的数组 要设两个,一个表示左集中的点 一个在右集中的点,
#include<iostream> #include<cstdio> #include<list> #include<algorithm> #include<cstring> #include<string> #include<queue> #include<stack> #include<map> #include<vector> #include<cmath> #include<memory.h> #include<set> #define ll long long #define LL __int64 #define eps 1e-8 const ll INF=9999999999999; using namespace std; #define M 400000100 #define inf 0xfffffff //vector<pair<int,int> > G; //typedef pair<int,int> P; //vector<pair<int,int>> ::iterator iter; // //map<ll,int>mp; //map<ll,int>::iterator p; vector<int>G[8000]; int mp[1212][1212]; int marry[8000],rmarry[8000]; bool vis[8000]; int vmax,vmin,l,r,mid; int dis[2][4]={0,-1,0,1,1,0,-1,0}; int n,m,k; void clear() { memset(marry,-1,sizeof(marry)); memset(rmarry,-1,sizeof(rmarry)); memset(vis,false,sizeof(vis)); memset(mp,0,sizeof(mp)); for(int i=0;i<=n;i++) G[i].clear(); } bool dfs(int x) { for(int i=0;i<G[x].size();i++) { int v=G[x][i]; if(!vis[v]) { vis[v]=true; if(marry[v]==-1 || dfs(marry[v])) { marry[v]=x; rmarry[x]=v;//这里有两个标记数组,分别代表左集 和 右集中的点跟谁进行了匹配 return 1; } } } return 0; } int main(void) { int t; scanf("%d",&t); while(t--) { clear(); scanf("%d",&n); int u,v; for(int i=0;i<3*n/2;i++) { scanf("%d %d",&u,&v); G[u].push_back(v); G[v].push_back(u); } int ans=0; for(int i=1;i<=n;i++) { if(rmarry[i]==-1)//因为自己的点进行匹配,一开始分集合并不明确,所以要有两个标记数组来判定 { memset(vis,false,sizeof(vis)); if(dfs(i)) ans++; } } printf("%d\n",ans/2); } }
相关文章推荐
- HDU 1845 Jimmy’s Assignment(二分匹配)
- HDU 1845 Jimmy’s Assignment【二分匹配,三正则图】
- hdu 1845 Jimmy’s Assignment 二分匹配最小点集覆盖
- HDU - 1845 Jimmy’s Assignment (二分匹配)
- hdu1845 Jimmy’s Assignment --- 完备匹配
- hdu 1845 Jimmy’s Assignment (二分匹配)
- hdu1045 Fire Net(最大二分匹配)
- hdu 1845(最大匹配)
- HDU 1845 Jimmy’s Assignment(二分图匹配)
- HDU 1151Air Raid 最小路径覆盖=n-最大匹配量 (第二道二分匹配)
- HDU-2444 The Accomodation of Students(二分图判断+最大二分匹配)
- HDU 2236 无题II【二分+最大匹配】
- Assignment (HDU 2853 最大权匹配KM)
- HDU1498 二分匹配+最大顶点覆盖
- HDU 2458 二分匹配求最大团
- Poj 3683 Jimmy’s Assignment【二分匹配】
- hdu 2063 过山车 基础最大二分匹配
- HDU 1281 棋盘游戏(最大二分匹配)
- hdu 2063 过山车(二分最大匹配)
- HDU 1151Air Raid 最小路径覆盖=n-最大匹配量 (第二道二分匹配)