| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1195 人关注过本帖
标题:一道ACM题目,难度7.4
只看楼主 加入收藏
fl8962
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:14
帖 子:539
专家分:2471
注 册:2012-10-17
结帖率:96.23%
收藏
已结贴  问题点数:20 回复次数:11 
一道ACM题目,难度7.4
题目链接: https://open.
图片附件: 游客没有浏览图片的权限,请 登录注册

我的代码通过了20组测试数据的前17组,第18组测试数据显示答案错误。但是ACM系统不提供具体测试数据是什么。所以我在这里希望有朋友可以给出可以通过的完全测试的代码,或者给出我代码不能通过的数据。下面是我的代码,我这代码编写时间大概40分钟,但是找错找了3个小时但是还是找不出问题所在。
如果有朋友帮我解决,我另开一贴,把我所有分(1000分)都给你。我代码本身没有语法错误,所以我就不加注释了,我只求我程序会给出错误答案的例子。
#include<iostream>
#include<string>
#include<vector>
using namespace std;
class node
{
public:
  int node_name;
  vector<int> adj;
  int value;
  int sent;
  node(int i)
  {
    node_name=i;
    value=0;
    sent=0;
  }
};
class graph
{
public:
  vector<node> node_list;
  int num;
  int mum;
  graph(int n,int m)
  {
    for(int i=0;i!=n;++i)
      {node nd(i);
       node_list.push_back(nd);
      }
    num=n;
    mum=m;
  }
  int h(vector<int> v,int n)
  {
    for(vector<int>::iterator p=v.begin();p!=v.end();++p)
      if(*p==n)
    return 1;
    return 0;
  }
  void add_edge(int from,int to)
  {
    node_list[from].adj.push_back(to);
    node_list[to].adj.push_back(from);
  }
  void run(int index,int time)
  {
    if(num==1||mum==0)
      {
    cout<<0<<endl;
    return ;
      }
    if(time==0)
      {
    cout<<0<<endl;
    return ;
      }
    if(node_list[index].adj.empty())
      {
    cout<<0<<endl;
    return ;
      }
    node_list[index].value=0;
    node_list[index].sent=1;
    vector<int> t1,t2,t3,t4;
    t1.push_back(index);
    t4=t1;
    while(time)
      {
    for(vector<int>::iterator p=t1.begin();p!=t1.end();++p)
      node_list[*p].value=0;
    while(!t1.empty())
      {
        
        for(vector<int>::iterator p=node_list[*t1.begin()].adj.begin();p!=node_list[*t1.begin()].adj.end();++p)
          {
        node_list[*p].value+=node_list[*t1.begin()].sent;
        if(!h(t3,*p))
          {
            t3.push_back(*p);
          }
            
          }
            t1.erase(t1.begin());
      }
    t1=t3;
    for(vector<int>::iterator p=t1.begin();p!=t1.end();++p)
      node_list[*p].sent=node_list[*p].value;
    /*    cout<<endl;
    for(int i=0;i!=5;++i)
      cout<<node_list[i].value<<" ";
      cout<<endl;*/
    t3.clear();
    time--;
      }
    int sum=0;
    for(int i=0;i!=num;++i)
      {
    sum+=node_list[i].value;
      }
    cout<<sum<<endl;
    return ;
  }
};
int main(void)
{
  int n,m,s,t;
  cin>>n;
  cin>>m;
  cin>>s;
  cin>>t;
  int from,to;
  if(m>n*(n-1)/2)
      return 0;
  graph g(n,m);
  while(m)
    {
      cin>>from;
      cin>>to;
      g.add_edge(from,to);
      m--;
    }
    g.run(s,t);
  return 0;
}


[此贴子已经被作者于2015-11-2 08:40编辑过]

搜索更多相关主题的帖子: include 朋友 
2015-11-02 08:36
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:20 
题目看不懂,猜也没猜出
2015-11-02 10:21
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:0 
终于把题目看懂了,该吃饭了
2015-11-02 10:45
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:0 
先自己写一个用作对比
程序代码:
#include <stdio.h>
#include <string.h>

int main( void )
{
    unsigned users[100] = { 0 };
    unsigned links[100*99/2][2] = { 0 };

    unsigned n, m, s, t;
    scanf( "%u%u%u%u", &n, &m, &s, &t );
    for( unsigned i=0; i!=m; ++i )
        scanf( "%u%u", &links[i][0], &links[i][1] );

    users[s] = 1u;
    for( unsigned ti=0; ti!=t; ++ti )
    {
        unsigned temps[100] = { 0 };
        for( unsigned li=0; li!=m; ++li )
        {
            temps[ links[li][0] ] += users[ links[li][1] ];
            temps[ links[li][1] ] += users[ links[li][0] ];
        }
        memcpy( users, temps, n*sizeof(unsigned) );
    }

    unsigned squawks = 0;
    for( unsigned i=0; i!=n; ++i )
        squawks += users[i];
    printf( "%u\n", squawks );

    return 0;
}

2015-11-02 11:19
fl8962
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:14
帖 子:539
专家分:2471
注 册:2012-10-17
收藏
得分:0 
回复 4楼 rjsp
图片附件: 游客没有浏览图片的权限,请 登录注册
通过了前十八组数据测试,第十九组测试失败。楼主最近图论学的有点晕了,不管干啥都想着建立图,看到rjsp 版主的代码才有点豁然开朗的感觉。额,请小r版主再努下力帮我把这个正确做出来吧。呃,昨天是见识了在国际ACM大赛上这种难度的题,从读题到解决,顶尖选手不会超过20分钟。。。。

想抽苏烟了。
2015-11-02 13:28
fl8962
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:14
帖 子:539
专家分:2471
注 册:2012-10-17
收藏
得分:0 
目测国内喜欢搞算法的学生真心不多,国内的大学生都喜欢搞点什么安卓,苹果开发,什么前端,什么网页。我这里一个学姐在北京某软件公司工作八年(目测是技术骨干),现在来美国读研,前几天这学姐去亚马逊面试。亚马逊给了她两道图论的题,然后学姐就被拒绝了。。。(给出的原因:我们认为聪明的头脑远比华丽的经验更重要)。

想抽苏烟了。
2015-11-02 13:39
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:0 
回复 6楼 fl8962
是这样,但只是暂时的现象。
现在就像当初改革开放的一开始,只要肯下海的人,就必然赚大钱。研发属于浪费时间,会慢人一步,所以大家都是倒买倒卖,来钱快。
但最终,只有拥有创新和生产能力的,才会大浪淘沙留下来。
2015-11-02 16:11
fl8962
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:14
帖 子:539
专家分:2471
注 册:2012-10-17
收藏
得分:0 
回复 3楼 rjsp
R版对这道题有更新的代码么?你之前的代码也是没能通过所有的测试。

想抽苏烟了。
2015-11-02 23:09
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:0 
回复 8楼 fl8962
程序代码:
#include <stdio.h>
#include <string.h>

int main( void )
{
    unsigned long long users[100] = { 0 };
    unsigned links[100*99/2][2];

    unsigned n, m, s, t;
    scanf( "%u%u%u%u", &n, &m, &s, &t );
    for( unsigned i=0; i!=m; ++i )
        scanf( "%u%u", &links[i][0], &links[i][1] );

    users[s] = 1u;
    for( unsigned ti=0; ti!=t; ++ti )
    {
        unsigned long long temps[100] = { 0 };
        for( unsigned li=0; li!=m; ++li )
        {
            temps[ links[li][0] ] += users[ links[li][1] ];
            temps[ links[li][1] ] += users[ links[li][0] ];
        }
        memcpy( users, temps, n*sizeof(users[0]) );
    }

    unsigned long long squawks = 0;
    for( unsigned i=0; i!=n; ++i )
        squawks += users[i];
    printf( "%llu\n", squawks );

    return 0;
}

算法不变,只是存储结果的类型由unsigned增大为unsigned long long就行了
2015-11-03 09:03
fl8962
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:14
帖 子:539
专家分:2471
注 册:2012-10-17
收藏
得分:0 
回复 9楼 rjsp
谢谢R版,我把我代码里的int 改为long long 以后也正确运行了。您的代码CPU 运行时间0.0S,我的代码0.01S。我一直以为我的代码不能完全通过是因为我的算法问题,我从没想过是因为我的输出结果类型不够大,整个C++板块所有版主里,您是我唯一佩服的,我一直把你当作我前进的榜样!

想抽苏烟了。
2015-11-03 09:45
快速回复:一道ACM题目,难度7.4
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.044754 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved