标签:main mem ram its fast euc max view and
传递闭包最开始是在Floyd-Warshall算法里面出现的,当时这算法用的很少就被我忽视了。。
传递闭包是指如果i能到达k,并且k能到达j,那么i就能到达j
Input
Output
Sample Input
1 0 2 1 1 2 2 0 0 0
Sample Output
1 1 2
题意:放最小的机器人使得能够访问到所有顶点,机器人不能后退就是指有向图
题解:刚开始居然以为用拓扑能做,后来发现蠢了,还是DAG的最小顶点覆盖问题,加一个传递闭包就行了
#include<map> #include<set> #include<cmath> #include<queue> #include<stack> #include<vector> #include<cstdio> #include<cstdlib> #include<cstring> #include<iostream> #include<algorithm> #define pi acos(-1) #define ll long long #define mod 1000000007 using namespace std; const int N=500+5,maxn=100+5,inf=0x3f3f3f3f; int n,color[N]; bool used[N],ok[N][N]; bool match(int x) { for(int i=1;i<=n;i++) { if(!used[i]&&ok[x][i]) { used[i]=1; if(color[i]==-1||match(color[i])) { color[i]=x; return 1; } } } return 0; } int main() { ios::sync_with_stdio(false); cin.tie(0); int m; while(cin>>n>>m,n||m){ memset(ok,0,sizeof ok); while(m--){ int a,b; cin>>a>>b; ok[a][b]=1; } for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { if(!ok[i][j]) { for(int k=1;k<=n;k++) { if(ok[i][k]&&ok[k][j]) ok[i][j]=1; } } } } int ans=0; memset(color,-1,sizeof color); for(int i=1;i<=n;i++) { memset(used,0,sizeof used); ans+=match(i); } cout<<n-ans<<endl; } return 0; }
标签:main mem ram its fast euc max view and
原文地址:http://www.cnblogs.com/acjiumeng/p/6748975.html