UVA 10973 - Triangle Counting

来源:互联网 发布:网络空间 概念股 编辑:程序博客网 时间:2024/06/05 08:19

一直TLE,看了报告才写出来

方法如下:

for x=1..n, adj[x] is the set { y: y>x and (x,y) is in E }.
w[1..n] is an array of integers, initially filled with zeroes

count = 0
for x = 1 to n:
   for each y in adj[x]: w[y] = 1
   for each y in adj[x]:
      for each z in adj[y]:
         count += w[z]
   for each y in adj[x]: w[y] = 0
return count


#include <iostream>#include <memory.h>#include <vector>#include <algorithm>#include <cstdio>#include <map>using namespace std;#define MAX 3001struct Edge{int v;Edge *next;Edge(int vv=0,Edge* nnext=NULL):v(vv),next(nnext){}}edges[MAX];int w[MAX];int n,m,ans;void addEdge(int u,int v){Edge *ne=&edges[u];while (ne->next)ne=ne->next;ne->next=new Edge(v,0);}int main(){int t;scanf("%d",&t);while (t--){scanf("%d%d",&n,&m);ans=0;memset(w,0,sizeof(w));memset(edges,0,sizeof(edges));for (int i=0;i<m;++i){int u,v;scanf("%d%d",&u,&v);if(u<v)addEdge(u,v);if(v<u)addEdge(v,u);}for (int x=1;x<=n;++x){Edge * ne;for (ne=edges[x].next;ne;ne=ne->next)w[ne->v]=1;//把所有x能连到的边标为1for(ne=edges[x].next;ne;ne=ne->next){Edge *ne2=edges[ne->v].next;for (;ne2;ne2=ne2->next)ans+=w[ne2->v];//对于每一个x能连接到的点y,遍历y的所有连接点,如果w[y的每个点]为1的话,说明这个点和x也连着 构成了triple}for (ne=edges[x].next;ne;ne=ne->next)w[ne->v]=0;//把所有x能连到的边标为0}printf("%d\n",ans);}return 0;}


原创粉丝点击