2015编程之美挑战赛:八卦的小冰

第三题:八卦的小冰

题目链接:http://hihocoder.com/contest/msbop2015round2b/problem/3


时间限制: 2000ms
单点时限: 1000ms
内存限制: 256MB

描述

小冰是个八卦的人,最近她对一个社交网站很感兴趣。

由于小冰是个机器人,所以当然可以很快地弄清楚这个社交网站中用户的信息啦。

她发现这个社交网站中有N个用户,用户和用户之间可以进行互动。小冰根据用户之间互动的次数和内容判断每对用户之间的亲密度。亲密度非负,若大于零表示这两个用户之间是好友关系。由于这个网站是活跃的,所以小冰会不停地更新用户之间的亲密度。

由于隐私保护,小冰无法知道每个用户的确切性别,但是作为一只很聪明的人工智能,小冰可以通过每个用户的行为来猜测性别。当然这种猜测是不准确的,小冰有可能会改变对一个用户的判断。

小冰想知道这个社交网络的八卦度是多少。八卦度的定义是社交网络中所有异性好友之间的亲密度之和。你能帮助她吗?

输入

第一行一个整数T,表示数据组数。接下来是T组数据,每组数据的格式如下:

第一行是三个整数N, M, Q,分别表示用户数、初始的好友对数、操作数。

第二行是N个空格隔开的数,第i个数表示i号用户的性别,用0或1表示。

接下来的M行,每行三个数x, y, z,代表初始状态用户x和用户y之间的亲密度是z。除此之外的用户之间的亲密度初始为0。

接下来是Q行,每行是以下三种操作中的一种:

1. “1 x”:改变用户x的性别

2. “2 x y z”:改变用户x与用户y之间的亲密度为z

3. “3”:询问八卦度

输出

对于每组数据首先输出一行"Case #X:",X为测试数据编号。

接下来对于每一个询问,输出一行包含询问的八卦度。

数据范围

1 ≤ T ≤ 20

1 ≤ x, y ≤ N

0 ≤ z ≤ 100000

小数据

1 ≤ N, M ≤ 100

1 ≤ Q ≤ 1000

大数据

1 ≤ N, M, Q ≤ 100000

样例输入
1
3 2 8
0 1 0
1 2 1
1 3 1
3
1 1
1 2
3
2 2 3 2
3
1 2
3
样例输出
Case #1:
1
2
2
3



实现代码如下:

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
#define maxn 110
int sex[maxn],f[maxn][maxn];
int m,n,q;
int main()
{
    int t,x,y,z,sum,que;
    int T=1;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d%d%d",&n,&m,&q);
        for(int i=1;i<=n;i++)
          scanf("%d",&sex[i]);
        memset(f,0,sizeof(f));
        for(int i=0;i<m;i++)
        {
            scanf("%d%d%d",&x,&y,&z);
            f[x][y]=z;
            f[y][x]=z;
        }
        bool flag=1;
        for(int i=0;i<q;i++)
        {
            scanf("%d",&que);
            switch(que)
            {
                case 1:scanf("%d",&x);
                       sex[x]=!sex[x];
                       break;
                case 2:scanf("%d%d%d",&x,&y,&z);
                       f[x][y]=z;
                       f[y][x]=z;
                       break;
                case 3:if(flag)
                       {
                           printf("Case #%d:\n",T++);
                           flag=0;
                       }
                       sum=0;
                       for(int j=1;j<=n;j++)
                         if(sex[j]==1)
                           for(int k=1;k<=n;k++)
                             if(sex[k]==0) sum+=f[j][k];
                        printf("%d\n",sum);
            }
        }
    }
    return 0;
}


评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值