hdu 3357

本文探讨了在特定公司股票购买规则下,如何通过算法计算出需要拒绝的购买方案数量。利用图论中的连通性原理,算法识别出自我购买和已购买关系导致的重复购买情况,从而有效减少不必要的交易,提升市场效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

http://acm.hdu.edu.cn/showproblem.php?pid=3357

题目大意:  所有公司不能购买自己公司的股票,如果a  购买了b  公司的股票,则a  含有b 公司的股票,给出一些购买方案,求出有多少种要拒绝。

#include<iostream>
#include<algorithm>
#include<cstring>
#include<ctime>
#include<cmath>
#include<string>
#include<cstdio>
#include<vector>
using namespace std;
const int inf = 300;
bool vis[inf+10][inf+10];
int main()
{
    int n,m,num=1,i,j,k,a,b;
    while(cin>>n>>m)
    {
        if(n + m == 0) break;
        memset(vis,false,sizeof(vis));
        int ans = 0;
        for(i = 1; i <= n; i++)
        vis[i][i] = true;
        for(i = 1; i <= m; i++)
        {
            scanf("%d%d",&a,&b);
            if(a == b) {vis[a][b] = true; ans++;}//首先自己不能购买自己的股票
            else if(vis[b][a] == true) ans++;//如果b  已经购买了a 的股票,要拒绝
                else if(!vis[a][b])//如果a 没有购买过b 的股票,执行下面语句,节省时间
                {
                    //a 要购买b 的股票,凡是购买过a 的公司,和购买过b 的公司都应该标记
                    for(j = 1; j <= n; j++)
                    {
                        if(vis[j][a])
                        {
                            for(k = 1; k <= n; k++)
                                if(vis[b][k]) vis[j][k] = true;
                        }
                    }
                }
        }
        cout<<num++<<". "<<ans<<endl;
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值