【CTSC2008】【BZOJ】【P1143】【祭祀river】【题解】

传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1143

Floyd传递闭包,然后求最大独立集,Orz wangxz!!!

首先我觉得这个做法的正确性显然

但由于讲不清楚被D了所以得说一下为什么floyd后如果u->v有边那么在二分图中只有一条左u到右v的边而没有左v到右u的边



Code:

/*//Orz wangxz!!!!!!
	ID:zky//Orz wangxz!!!!!!
	OJ:BZOJ//Orz wangxz!!!!!!
	Index:1143//Orz wangxz!!!!!!
	Language:C++//Orz wangxz!!!!!!
*///Orz wangxz!!!!!!
#include<cstdio>//Orz wangxz!!!!!!
#include<cstring>//Orz wangxz!!!!!!
#include<iostream>//Orz wangxz!!!!!!
#include<algorithm>//Orz wangxz!!!!!!
using namespace std;//Orz wangxz!!!!!!
int n,m;//Orz wangxz!!!!!!
int vis[101];//Orz wangxz!!!!!!
int Link[101];//Orz wangxz!!!!!!
int map[101][101];//Orz wangxz!!!!!!
bool find(int x){//Orz wangxz!!!!!!
	for(int i=1;i<=n;i++){//Orz wangxz!!!!!!
		if(!vis[i]&&map[x][i]){//Orz wangxz!!!!!!
			vis[i]=1;//Orz wangxz!!!!!!
			if(!Link[i]||find(Link[i])){//Orz wangxz!!!!!!
				Link[i]=x;//Orz wangxz!!!!!!
				return true;//Orz wangxz!!!!!!
			}//Orz wangxz!!!!!!
		}//Orz wangxz!!!!!!
	}//Orz wangxz!!!!!!
	return false;//Orz wangxz!!!!!!
}//Orz wangxz!!!!!!
int main(){//Orz wangxz!!!!!!
	cin>>n>>m;//Orz wangxz!!!!!!
	memset(map,0,sizeof(map));//Orz wangxz!!!!!!
	for(int i=1;i<=m;i++){//Orz wangxz!!!!!!
		int u,v;//Orz wangxz!!!!!!
		cin>>u>>v;//Orz wangxz!!!!!!
		map[u][v]=1;//Orz wangxz!!!!!!
//		map[v][u]=1;//Orz wangxz!!!!!!
	}//Orz wangxz!!!!!!
	for(int k=1;k<=n;k++)//Orz wangxz!!!!!!
	for(int i=1;i<=n;i++)//Orz wangxz!!!!!!
	for(int j=1;j<=n;j++)//Orz wangxz!!!!!!
	map[i][j]=map[i][j]||(map[i][k]&&map[k][j]);//Orz wangxz!!!!!!
	//Orz wangxz!!!!!!
//	for(int i=1;i<=n;i++)
//	for(int j=1;j<=n;j++)
//	if(map[i][j])map[i][j]=0;else map[i][j]=1;
	//Orz wangxz!!!!!!
	int ans=0;//Orz wangxz!!!!!!
	for(int i=1;i<=n;i++){//Orz wangxz!!!!!!
		memset(vis,0,sizeof(vis));//Orz wangxz!!!!!!
		if(find(i))ans++;//Orz wangxz!!!!!!
	}//Orz wangxz!!!!!!
	cout<<n-ans<<endl;//Orz wangxz!!!!!!
	return 0;//Orz wangxz!!!!!!
}//Orz wangxz!!!!!!


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值