poj 3275 Ranking The Cows

题目大意:
略了。。。。

大概就是邻接矩阵会t的一道题,所以用邻接表优化。

邻接表写跪了。。我的天。。

主要是高低的邻接表。。

#include
#include
#include
using namespace std;
//by mars_ch
int c[1005][1005],map[1005][1005];
int n,m;
struct node
{
    int f,t,w,nxt;
}e[1000005];
int tot,first[10005];
struct data
{
    int f,t,w,nxt;
}b[1000005];
int head[10005],tol;
void add1(int a,int b)
{
    e[tot].f=a,e[tot].t=b;
    e[tot].nxt=first[a];
    first[a]=tot++;
}
void add2(int a,int bb)
{
    e[tot].f=a,e[tot].t=bb;
    e[tot].nxt=head[a];
    head[a]=tot++;
}
int main()
{
    memset(first,-1,sizeof(first));
    memset(head,-1,sizeof(head));
    scanf("%d%d",&n,&m);
    int ans=n*(n-1)/2;
     int cnt=0;
     for(int i=1;i<=m;i++)
     {
        int a,b;
        scanf("%d%d",&a,&b);
        add1(a,b);
        add2(b,a);
        map[a][b]=1;
     }
    for(int i=1;i<=n;i++)
    {
        for(int j=head[i];j!=-1;j=e[j].nxt)
        {
            int a=e[j].t;
            for(int k=first[i];k!=-1;k=e[k].nxt)
            {
                int bb=e[k].t;
                if(map[a][bb]) continue;
//              printf("i=%d a=%d bb=%d\n",i,a,bb);
                map[a][bb]=1;
                add1(a,bb);
                add2(bb,a);
            }
        }
    }
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++)
        {
            if(map[i][j] == 1)
            {
                cnt++;
            }
        }
    }
     printf("%d\n",ans-cnt);
    return 0;
}

你可能感兴趣的:(usaco,usaco,月赛题解)