【codevs 1222】 信与信封问题
2016-09-19 10:14
253 查看
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<cmath> using namespace std; #define maxn 110 int n; bool d[maxn][maxn],vis[maxn]; int link_fa[maxn],link_son[maxn]; int ans = 0; bool dfs(int u) { for(int i=1;i<=n;i++) { if(!d[u][i]&&!vis[i]) { vis[i] = 1; if(!~link_fa[i]||dfs(link_fa[i])) { link_fa[i] = u; link_son[u] = i; return 1; } } } return 0; } int main(void) { scanf("%d",&n); int a,b; while(scanf("%d%d",&a,&b)&&a&&b) d[a][b]=true; memset(link_fa,-1,sizeof(link_fa)); for(int i=1;i<=n;i++) { memset(vis,0,sizeof(vis)); if(dfs(i))ans++; } if(ans<n)printf("none\n"); else { bool flag = 0; for(int i=1;i<=n;i++) { memset(vis,0,sizeof(vis)); int t = link_son[i]; d[i][t] = true; link_fa[t]=-1,link_son[i]=-1; if(!dfs(i)) { printf("%d %d\n",i,t); link_fa[t]=i,link_son[i]=t; flag = true; } d[i][t] = false; } if(!flag)printf("none\n"); } return 0; }二分图,假如一条边不可获缺,那么没有它一定无法完美匹配,由此可以推得先进行一次匹配,再对匹配的边依次删除,如果不能完美匹配就输出
相关文章推荐
- CODEVS1222 信与信封问题 (匈牙利算法)
- CODEVS 1222 信与信封问题 题解&代码
- Codevs 1222 信与信封问题 二分图匹配
- codevs 1222 信与信封问题(二分图匹配,匈牙利算法)
- codevs1222 信与信封的问题
- codevs1222 信与信封问题
- 【CodeVS 1222】信与信封的问题 随机化+treat Hungery
- codevs 1222 信与信封问题 二分图 匈牙利 解题报告
- Codevs 1222 信与信封问题 [二分图匹配] [匈牙利算法]
- codevs 1222 信与信封问题
- codevs 1222 信与信封问题(二分图的完美匹配)
- [codevs1222]信与信封问题(匈牙利)
- 1222 信与信封问题
- WIKIOI 1222信与信封问题
- 1222 信与信封问题(二分图匹配)
- [CODEV1222]信与信封问题
- Codevs 1222 信与信封问题 二分图匹配,匈牙利算法
- 【wikioi】1222 信与信封问题(二分图+特殊的技巧)
- codevs 1222 信与信封问题(二分图匹配 可确定的关系)
- 信与信封问题(codevs 1222)