3899

来源:互联网 发布:java的网络编程重要吗 编辑:程序博客网 时间:2024/06/11 04:27

Description

假如有命题p 一定能推出命题q,则称p 是q 的充分条件,q 是p 的必要条件。
特别的,当p 既是q 的充分条件,又是q 的必要条件时,称p 和q 互为充要条件
现在有n 个命题,其中一些是另一些的充分条件。请问有多少对命题互为充要条件?

Input

第一行三个正整数n,m,分别表示命题数、已知关系数
接下来m 行,每行两个正整数p 和q,表示命题p 是命题q 的充分条件

Output

仅一行,一个整数,表示充要条件的对数

Sample Input

5 51 33 22 14 55 4

Sample Output

4样例说明:4 对充要条件分别是(1, 2)、(2, 3)、(1, 3)、(4, 5)

Data Constraint

对于10% 的数据,n <= 10;m <= 50
对于40% 的数据,n <= 500;m <= 1000
对于另外10% 的数据,数据中保证没有重边且m = n^2

对于100% 的数据,n<= 50000;m <= 600000

var        a,b,i,j,p1,time:longint;        v,x,y,low,dfn:array[0..600000] of longint;        last:array[0..600000,1..2]of longint;        p:array[0..600000]of boolean;        ans,ans1:int64;function min(i,j:longint):longint;begin        if i<j then                exit(i);        exit(j);end;function max(i,j:longint):longint;begin        if i<j then                exit(j);        exit(i);end;procedure dfs(x:longint);var        i,j,r:longint;begin        inc(p1);        v[p1]:=x;        r:=last[x,1];        inc(time);        low[x]:=time;        dfn[x]:=time;        p[x]:=true;        while r<>0 do        begin                if dfn[y[r]]=0 then                begin                        dfs(y[r]);                        low[x]:=min(low[x],low[y[r]]);                end                        else                if p[y[r]] then low[x]:=min(low[x],low[y[r]]);                r:=last[r,2];        end;        ans1:=0;        if dfn[x]=low[x] then        begin                while v[p1+1]<>x do                begin                        p[v[p1]]:=false;                        inc(ans1);                        dec(p1);                end;                ans:=ans+ans1*(ans1-1) div 2;        end;end;begin        //assign(input,'1.in');reset(input);        readln(a,b);        for i:=1 to b do        begin                readln(x[i],y[i]);                last[i,2]:=last[x[i],1];                last[x[i],1]:=i;        end;        for i:=1 to a do                if dfn[i]=0 then dfs(i);        writeln(ans);        close(input);end.

0 0