题目大意:给定m条关系使得关系组成不能有环存在(及矛盾如1 2 , 2 1).求这种矛盾的语句的个数。
思路:直接写了一个拓扑排序,结果超时,有些没用的节点没有处理掉,也加入了队列,使得程序遍历数据量变大。 那么,明显的可以用二维数组模拟关系,如
a b,如果可以到a的节点同样也可以到达b节点,那么到达b节点的点,也可以到达b所能达到的节点。那么遍历找到这种关系,就优化了好多。
#include<map>
#include<queue>
#include<cmath>
#include<iostream>
#include<cstdio>
#include<stack>
#include<cstring>
#include<algorithm>
#define inf 0x3f3f3f3f
using namespace std;
bool mp[250][250];
int n;
int main(){
int m,i,j,k,a,b,t,cla=0;
while(~scanf("%d%d",&n,&m)){
t=0;
if(n==0&&m==0)
break;
for(i=1;i<=n;++i){
for(j=i;j<=n;++j){
i==j?mp[i][j]=true:mp[i][j]=mp[j][i]=false;
}
}
for(i=0;i<m;++i){
scanf("%d%d",&a,&b);
if(a==b){
t++;
continue;
}
else if(mp[b][a]){
t++;
continue;
}
if(mp[a][b]==false){
mp[a][b]=true;
for(j=1;j<=n;j++){
if(mp[j][a]){
mp[j][b]=true;
for(k=1;k<=n;++k){
if(mp[b][k]){
mp[j][k]=true;
if(mp[k][a])
t++;
}
}
}
}
}
}
printf("%d. %d\n",++cla,t);
}
return 0;
}