1. 程式人生 > 其它 >poj 3275(鄰接表解法,first,next,v代表以k為起點的終點集,first2,next2,v2代表以k為終點的起點集)

poj 3275(鄰接表解法,first,next,v代表以k為起點的終點集,first2,next2,v2代表以k為終點的起點集)

#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; }