ACM复习

    xiaoxiao2023-09-29  147

    //并查集模板 https://blog.csdn.net/Tribleave/article/details/72878239 #include <bits/stdc++.h> using namespace std; int f[100005]; int find(int x) { if(x!=f[x]) { f[x]=find(f[x]); } return f[x]; } void merge(int x, int y) { int xx=find(x); int yy=find(y); if(xx!=yy) { f[xx]=f[yy]; } } int main() { int n, m; while(scanf("%d%d", &n, &m)!=EOF) { for(int i=1; i<=n; i++) { f[i]=i; } int a, b; for(int i=1; i<=m; i++) { scanf("%d%d", &a, &b); merge(a, b); } scanf("%d%d", &a, &b); if(find(a)==find(b)) { printf("same\n"); } else { printf("not sure\n"); } } return 0; } //匈牙利算法 acmsdut4181 最大匹配 #include <bits/stdc++.h> using namespace std; const int maxn=505; int Map[maxn][maxn]; int vis[maxn]; int match[maxn]; int n, m; bool dfs(int x) { for(int i=1;i<=m;i++) { if (!vis[i] && Map[x][i]) { vis[i]=1; if(match[i]==-1||dfs(match[i])) { match[i]=x; return true; } } } return false; } int main() { int k, a, b, ans; while(scanf("%d", &k)!=EOF) { ans=0; if(k==0) return 0; scanf("%d%d", &n, &m); memset(Map, 0, sizeof(Map)); memset(match, -1, sizeof(match)); for(int i=0;i<k;i++) { scanf("%d%d", &a, &b); Map[a][b]=1; } for(int i=1;i<=n;i++) { memset(vis, 0, sizeof(vis)); if(dfs(i)) ans++; } printf("%d\n", ans); } return 0; }

     

    最新回复(0)