poj 3275(鄰接表解法,first,next,v代表以k為起點的終點集,first2,next2,v2代表以k為終點的起點集)
阿新 • • 發佈:2021-08-25
#include<iostream> #include<cstring> #include<cstdio> using namespace std; const int maxn = 1005; const int N = 1000005; int data[maxn][maxn]; int next[N],v[N],first[N],next2[N],v2[N],first2[N]; int n,m,total,total2; void add(int a,int b){ v[++total] = b; next[total] = first[a]; first[a]= total; } void add2(int a,int b){ v2[++total2] = b; next2[total2] = first2[a]; first2[a] = total2; } int main(){ int i,j,a,b,ans; scanf("%d%d",&n,&m); memset(data,0,sizeof data); for(i=1;i<=m;i++){ scanf("%d%d",&a,&b); data[a][b] = 1; add(a,b); add2(b,a); } ans= m; for(int k=1;k<=n;k++){ for(int i=first[k];i>0;i=next[i]){ for(int j=first2[k];j>0;j=next2[j]){ if(data[v2[j]][v[i]]==0){ data[v2[j]][v[i]] = 1; ans++; add(v2[j],v[i]); add2(v[i],v2[j]); } } } } cout<<n*(n-1)/2-ans<<endl; return 0; }