nyoj 239 月老的难题
题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=239
简单的二分匹配,不过这道题很怪,矩阵就是tle,临界表200多,很无语。
以前做个,没过现在看看以前还是没学好,有几处明显错误!
AC
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 using namespace std; 5 int n[505],m[505]; 6 int vist[505]; 7 int head[505]; 8 struct ss { 9 int x,next; 10 }edge[10005]; 11 int N; 12 int sum,g; 13 int dfs(int v) 14 { 15 int i,tt; 16 17 for (i=head[v];i!=-1;i=edge[i].next) 18 { 19 tt=edge[i].x; 20 if(!vist[tt]) 21 { 22 vist[tt]=1; 23 if(m[tt]==-1||dfs(m[tt])) 24 { 25 n[v]=tt; 26 m[tt]=v; 27 return 1; 28 } 29 } 30 } 31 return 0; 32 } 33 void maxmatch() 34 { 35 int i; 36 sum=0; 37 for (i=1;i<=g;i++) 38 { 39 memset(vist,0,sizeof(vist)); 40 if(n[i]==-1&&dfs(i)) 41 sum++; 42 } 43 } 44 int main() 45 { 46 int i,x,y,k,w; 47 scanf("%d",&k); 48 while (k--) 49 { 50 scanf("%d%d",&g,&w); 51 N=0; 52 memset(n,-1,sizeof(n)); 53 memset(m,-1,sizeof(m)); 54 memset(head,-1,sizeof(head)); 55 for (i=1;i<=w;i++) 56 { 57 scanf("%d%d",&x,&y); 58 edge[N].x=y; 59 edge[N].next=head[x]; 60 head[x]=N++; 61 } 62 maxmatch(); 63 printf("%d\n",sum); 64 } 65 return 0; 66 }
tle
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 using namespace std; 5 int map[505][505],n[505],m[505]; 6 int vist[505]; 7 int sum,g; 8 int dfs(int v) 9 { 10 int i; 11 12 for (i=1;i<=g;i++) 13 if(!vist[i]&&map[v][i]) 14 { 15 vist[i]=1; 16 if(m[i]==-1||dfs(m[i])) 17 { 18 n[v]=i; 19 m[i]=v; 20 return 1; 21 } 22 } 23 return 0; 24 } 25 void maxmatch() 26 { 27 int i; 28 sum=0; 29 for (i=1;i<=g;i++) 30 { 31 memset(vist,0,sizeof(vist)); 32 if(n[i]==-1&&dfs(i)) 33 sum++; 34 } 35 } 36 int main() 37 { 38 int i,x,y,k,w; 39 scanf("%d",&k); 40 while (k--) 41 { 42 scanf("%d%d",&g,&w); 43 memset(map,0,sizeof(map)); 44 memset(n,-1,sizeof(n)); 45 memset(m,-1,sizeof(m)); 46 47 for (i=1;i<=w;i++) 48 { 49 scanf("%d%d",&x,&y); 50 map[x][y]=1; 51 } 52 maxmatch(); 53 printf("%d\n",sum); 54 } 55 return 0; 56 }