题目:Triangle LOVE
因为每两个点一定有且仅有一条指向边,那么先假定点按顺序1,2,....n,每个点一定指向后面的点,即1指向2,3,4.....n,2指向3,4,5....n。。。。。那么
每个点的出度分别为n-1,n-2,n-3,....0,而此时任意反向一条边都能够得到一个环,因为反向了一条边,则这条边的两个的出度一个加1一个减1,使得所
有点中一定存在两个点的出度相同。那么对于其他有向图都可以由【元图】反向某些边得到,所以只要用反证法,如果所有点里面没有两个点的出度
相同则肯定不存在环,否则存在。时间复杂度O(n);
对于判断一个图中是否存在两点的出度相同,本问题很简单,对于图中我们先用一个数组统计每个点的出度大小,然后排序,然后就可以看是否存在相
邻的两个数组值是否相等就行了。
#include <iostream> #include <stdio.h> #include <string.h> #include <algorithm> using namespace std; const int N=2500; int out[N]; char str[N][N]; int main() { int i,j,k,n,m,T; scanf("%d",&T); char c; int t=1; while(T--) { scanf("%d",&n); memset(out,0,sizeof(out)); for(i=0;i<n;i++) scanf("%s",str[i]); for(i=0;i<n;i++) for(j=0;j<n;j++) if(str[i][j]=='1') out[i]++; sort(out,out+n); bool flag=false; for(i=0;i<n-1;i++) { if(out[i]==out[i+1]) { flag=true; break; } } printf("Case #%d: ",t++); printf("%s\n",flag?"Yes":"No"); } return 0; }