标签:
题意是,一个公司A要想可以控制另外一个公司B,必须满足一下三个条件之一
1.A等于B。也就是自己控制自己。
2.A拥有B的超过百分之50的股份。
3.A控制的所有公司拥有B的股份和超过百分之50.
求输出所有公司之间的控制关系。不输出自己控制自己的情况。
看见求任意两点之间的控制关系,先想到了Floyd,但是好像用不了,后来就直接按着题意写了一下,wa了之后,发现公司的间接控制关系可以继续拓展。然后改了一下。
我给出的算法类似于bellman-ford,通过变量m控制每次间接通过新增的点数来拓展。
比如,有
1 2 51
1 3 51
1 4 51
2 5 11
3 5 20
4 5 20
5 7 51
第一遍发现了点1通过间接控制可控制5,那么在m增大之后,再做一遍就会通过5号点扩展到7,也就是公司1控制公司7
还见到有人写了思想类似于spfa的算法,这是某位大神的链接http://www.cnblogs.com/ACShiryu/archive/2011/07/18/2109336.html
因为数据范围小,所以我的这种没优化的算法也过了(其实是优化了空间了的,类似于bellman-ford基于dp思想的空间优化)
/* ID: modengd1 PROG: concom LANG: C++ */ #include <iostream> #include <stdio.h> #include <memory.h> using namespace std; int A[100][100]; bool C[100][100]; int main() { freopen("concom.in","r",stdin); freopen("concom.out","w",stdout); memset(C,false,sizeof(C)); memset(A,0,sizeof(A)); int N,a,b,p; scanf("%d",&N); for(int i=0;i<N;i++) { scanf("%d%d%d",&a,&b,&p); A[a-1][b-1]=p; if(A[a-1][b-1]>50) C[a-1][b-1]=true; } for(int m=0;m<100;m++) for(int i=0;i<100;i++) { C[i][i]=true; for(int j=0;j<100;j++) { int sum=0; if(!C[i][j]) { for(int k=0;k<100;k++) { if(C[i][k]) sum+=A[k][j]; } if(sum>50) C[i][j]=true; } } } for(int i=0;i<100;i++) { for(int j=0;j<100;j++) { if(C[i][j]&&i!=j) { cout<<i+1<<‘ ‘<<j+1<<endl; } } } return 0; }
标签:
原文地址:http://www.cnblogs.com/modengdubai/p/4783092.html