HNU13377:Book Club 二分图
题意:有n个人,m种需求,给出m行,每行a,b代表a想要的书在b那里,问能不能通过交换的方法来满足每个人的需求
思路:要符合题意的话一定是二分图。网上还一种dfs
1 #include<cstdio> 2 #include<iostream> 3 #include<cstdlib> 4 #include<memory.h> 5 #include<vector> 6 using namespace std; 7 const int maxn = 20010; 8 int uN,vN; 9 vector<int> g[maxn]; 10 int linker[maxn]; 11 int n; 12 bool used[maxn]; 13 bool dfs(int u) { 14 for(int i=0;i<g[u].size(); i++) { 15 int v=g[u][i]; 16 if(!used[v]) { 17 used[v]=true; 18 if(linker[v]==-1||dfs(linker[v])) { 19 linker[v]=u; 20 return true; 21 } 22 } 23 24 } 25 return false; 26 } 27 28 int main() { 29 int m,i; 30 int x,y; 31 while(~scanf("%d%d",&n,&m)) { 32 int ans=0; 33 for(i=0; i<=n; i++) 34 g[i].clear(); 35 for(i=0; i<m; i++) { 36 scanf("%d%d",&x,&y); 37 g[x].push_back(y); 38 } 39 memset(linker,-1,sizeof(linker)); 40 for(i=0; i<n; i++) { 41 memset(used,0,sizeof(used)); 42 if(dfs(i))ans++; 43 } 44 // cout<<ans<<endl; 45 if(ans==n)cout<<"YES"<<endl; 46 else cout<<"NO"<<endl; 47 // for(i=0; i<n; i++) { 48 // if(linker[i]==-1) { 49 // break; 50 // } 51 // } 52 // if(i==n) { 53 // printf("YES\n"); 54 // } else 55 // printf("NO\n"); 56 } 57 }