离散题目18(传递闭包)
2017-06-10 23:34
211 查看
离散题目18
Time Limit: 1000MS Memory Limit: 65536KB
Submit Statistic
Problem Description
给出一个集合A和A上的关系R,求关系R的传递闭包。
例如:
A={0,1,2} , R={<0,0>,<1,0>,<2,2>,<1,2>,<2,1>}
t(R) = {<0,0>,<1,0>,<2,2>,<2,1>,<1,2>,<1,1>,<2,0>};
Input
多组输入,输入n、m,集合A={0, 1, …, n-1 };m代表关系的数量,n、m不超过20.
Output
每组输入输出t(R),根据t(R)中序偶的第一个数字升序排序,如果第一个数字相同,根据第二个升序排序。
Example Input
3 5
0 0
1 0
2 2
1 2
2 1
Example Output
0 0
1 0
1 1
1 2
2 0
2 1
2 2
沃舍尔算法
Time Limit: 1000MS Memory Limit: 65536KB
Submit Statistic
Problem Description
给出一个集合A和A上的关系R,求关系R的传递闭包。
例如:
A={0,1,2} , R={<0,0>,<1,0>,<2,2>,<1,2>,<2,1>}
t(R) = {<0,0>,<1,0>,<2,2>,<2,1>,<1,2>,<1,1>,<2,0>};
Input
多组输入,输入n、m,集合A={0, 1, …, n-1 };m代表关系的数量,n、m不超过20.
Output
每组输入输出t(R),根据t(R)中序偶的第一个数字升序排序,如果第一个数字相同,根据第二个升序排序。
Example Input
3 5
0 0
1 0
2 2
1 2
2 1
Example Output
0 0
1 0
1 1
1 2
2 0
2 1
2 2
沃舍尔算法
include <stdio.h> include <stdlib.h> include<string.h> struct { int x,y; } s1[10000000] ; int a[1000][1000]; int main() { char s[10000]; int i,j,f,n,k,t,m,b[1000],x,y; while(~scanf("%d%d",&n,&m)) { memset(a,0,sizeof(a)); f=1; for(i=0;i<m;i++) { scanf("%d%d",&x,&y); a[x][y]=1; } for< 4000 /span>(i=0;i<n;i++) for(j=0;j<n;j++) { if(a[j][i]>=1) { for(k=0;k<n;k++) { a[j][k]=a[i][k]+a[j][k]; } } } for(i=0;i<n;i++) for(j=0;j<n;j++) if(a[i][j]>=1) printf("%d %d\n",i,j); } return 0; }