FLOYD的邻接表形式
这个题目费解的地方时问题是换需要再调查多少对关系等于C(N, 2) - K(N是点数,K是已清楚的关系对)
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<map>
#include<string>
#define N 1010
#define M 10100
typedef long long ll;
using namespace std;
struct Edge{
int u,v,next;
}edge[N*N*2];
int head1[N],head2[N],p;//head1初边,head2入边
int dis[N][N];
void addedge1(int u,int v){
edge[p].u=u;
edge[p].v=v;
edge[p].next=head1[u];
head1[u]=p++;
}
void addedge2(int u,int v){
edge[p].u=u;
edge[p].v=v;
edge[p].next=head2[u];
head2[u]=p++;
}
void init(){
memset(head1,-1,sizeof(head1));
memset(head2,-1,sizeof(head2));
memset(dis,0,sizeof(dis));
p=0;
}
int main(){
int i,j,k,n,m;
int u,v;
scanf("%d %d",&n,&m);
init();
for(i=1;i<=m;i++){
scanf("%d %d",&u,&v);
dis[u][v]=1;
addedge1(u,v);
addedge2(v,u);
}
for(j=1;j<=n;j++)
for(i=head1[j];i!=-1;i=edge[i].next){
v=edge[i].v;
for(k=head2[j];k!=-1;k=edge[k].next){
u=edge[k].v;
if(dis[u][v]==0){
dis[u][v]=1;
addedge1(u,v);
addedge2(v,u);//这里要注意
}
}
}
int ans=0;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(dis[i][j]==1)
ans++;
printf("%d\n",n*(n-1)/2-ans);
return 0;
}