题意:给你n个数和m个大小关系,问给出了这些大小关系之后还有多少对数的大小关系不知道。
分析:根据给出的大小关系建有向边,每次对每个点延有向边搜索到底,确定该边的所有连边关系,最后统计没有关系的边对数。


#include <cstdio> #include <cstring> #include <iostream> using namespace std; #define re(i,n) for(int i=0;i<n;i++) #define re1(i,n) for(int i=1;i<=n;i++) const int maxn = 2020 , maxm = 20020; int n , m; bool pan[maxn][maxn] , vis[maxn]; struct Edge{ int v, next; }edge[maxm]; int E,head[maxn]; inline void init() { E = 0 ;memset(head,-1,sizeof(head)); } inline void addedge(int u,int v) { edge[E].v=v;edge[E].next=head[u];head[u]=E++; } void dfs(int p , int u) { pan[p][u] = pan[u][p] = 1; for(int i=head[u];i!=-1;i=edge[i].next) { int v = edge[i].v; if(vis[v]) continue; vis[v] = true; dfs(p , v); } } void solve() { int ans = 0; re1(i,n) { memset(vis,0,sizeof(vis)); dfs(i , i); } re1(i,n) re1(j,n) if(!pan[i][j]) ans ++; printf("%d\n",ans/2); } int main() { while(~scanf("%d%d",&n,&m)) { memset(pan,0,sizeof(pan)); init(); while(m--) { int u , v ; scanf("%d%d",&u,&v); addedge(u,v); } solve(); } return 0; }