标签:tis term otherwise tle sim time -- panel represent
题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=1083
Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
1 #include<cstdio> 2 #include<cstring> 3 #include<vector> 4 #define MAX 410 5 using namespace std; 6 int p,n; 7 struct Edge{ 8 int u,v; 9 }; 10 vector<Edge> E; 11 vector<int> G[MAX]; 12 int matching[MAX]; 13 int vis[MAX]; 14 void init(int l,int r) 15 { 16 E.clear(); 17 for(int i=l;i<=r;i++) G[i].clear(); 18 } 19 void add_edge(int u,int v) 20 { 21 E.push_back((Edge){u,v}); 22 E.push_back((Edge){v,u}); 23 int _size=E.size(); 24 G[u].push_back(_size-2); 25 G[v].push_back(_size-1); 26 } 27 bool dfs(int u) 28 { 29 for(int i=0,_size=G[u].size();i<_size;i++) 30 { 31 int v=E[G[u][i]].v; 32 if (!vis[v]) 33 { 34 vis[v]=1; 35 if(!matching[v] || dfs(matching[v])) 36 { 37 matching[v]=u; 38 matching[u]=v; 39 return 1; 40 } 41 } 42 } 43 return false; 44 } 45 int hungarian() 46 { 47 int ret=0; 48 memset(matching,0,sizeof(matching)); 49 for(int i=1;i<=p;i++) 50 { 51 if(!matching[i]) 52 { 53 memset(vis,0,sizeof(vis)); 54 if(dfs(i)) ret++; 55 } 56 } 57 return ret; 58 } 59 int main() 60 { 61 int t; 62 scanf("%d",&t); 63 while(t--) 64 { 65 scanf("%d%d",&p,&n); 66 init(1,p+n); 67 for(int i=1,cnt,stu;i<=p;i++) 68 { 69 scanf("%d",&cnt); 70 for(int j=1;j<=cnt;j++) 71 { 72 scanf("%d",&stu); 73 add_edge(i,stu+p); 74 } 75 } 76 if(hungarian()==p) printf("YES\n"); 77 else printf("NO\n"); 78 } 79 }
HDU 1083 - Courses - [匈牙利算法模板题]
标签:tis term otherwise tle sim time -- panel represent
原文地址:http://www.cnblogs.com/dilthey/p/7662838.html