这题好难

P2319 [HNOI2006] 超级英雄

大水题啊 ```cpp #include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<algorithm> #include<cmath> using namespace std; int n,m;int mp[1005][1005],flag[1005],mat[1005],from[1005]; bool km(int x){ for(int i=0;i<n;i++) { if(mp[x][i]&&!flag[i]) { flag[i]=1; if(!mat[i]||km(mat[i])) { mat[i]=x; from[x]=i; return 1; } } } return 0; } int main(){ scanf("%d%d",&n,&m); int x,y; for(int i=1;i<=m;i++){ scanf("%d%d",&x,&y); mp[i][x]=mp[i][y]=1; } int ans=0; for(int i=1;i<=m;i++) { memset(flag,0,sizeof(flag)); if(km(i)) ans++; else break; } printf("%d\n",ans); for(int i=1;i<=ans;i++){ printf("%d\n",from[i]); } return 0; } ```
by Edgration @ 2017-06-23 15:55:44


捕捉野生红名dalao
by Mirach @ 2017-10-23 21:28:03


@[Edgration](/space/show?uid=42857) 巨佬求助 ``` #include<bits/stdc++.h> using namespace std; int gx[1000][1000],a[1000],vis[1000],b[1000]; int n,m,k,x,y,sum,ans; //gx[i][j]:表示i和j可以相连 //a[i]:表示i暂时最好情况连a[i] //vis[i]:表示i已经被连 int Find(int x){ for(int i=0;i<=m-1;i++){//遍历所有被选者 if(gx[x][i]==1&&vis[i]==0){ //如果 x和i可以相连,且在这一个递归选取阶段暂时没有被选取 //暂时选取,因为新的递归可能会换更好的 vis[i]=1;//标记被选取 if(a[i]==0||Find(a[i])){ //如果被选者没有相连点或他的相连点着可以调换 //那么他的相连点就可以选择其它没有相连点的点,以求最多 a[i]=x;//将相连点定为 x ans++; b[ans]=x; return 1; } } } return 0; } int main(){ cin>>n>>m; for(int i=0;i<=m-1;i++){ cin>>x>>y; gx[i][x]=1; gx[i][y]=1; } for(int i=1;i<=n;i++){ memset(vis,0,sizeof(vis));//每次都要清 0 if(Find(i)!=0) sum++;//找到一对就记录 } cout<<sum<<endl; for(int i=1;i<=sum;i++){ cout<<a[i]<<endl; } return 0; } ```
by xlxl @ 2019-08-12 11:41:09


@[xlxl](/user/120669) >主持人问题准备了若干道题目,只有当选手正确回答一道题后,才能进入下一题,**否则就被淘汰**。 最后那里要 $\tt break$ 呀
by sid666 @ 2022-02-10 19:22:49


|