访问集

时间:2016-07-11 11:12:49

标签: stl set

 #include <bits/stdc++.h>
 using namespace std;

#define fast ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define LL long long int
#define pb push_back
#define mp make_pair
#define PII pair<int,int>
#define PLL pair<LL,LL>
#define PIS pair< int,string>


#define test int t;cin>>t;while(t--)
#define ff first // error: 'std::set<std::pair<long long int, long long int> >::iterator' has no member named 'first'
#define ss second // error: 'std::set<std::pair<long long int, long long int> >::iterator' has no member named 'second'
#define INF 1000000000
#define input(a,n) for(i=1;i<=n;i++)cin>>a[i];
#define output(a,n) for(i=1;i<=n;i++)cout<<a[i]<<" ";
vector< vector<LL> > v(3002, vector<LL>(3002,-1));
set< pair<LL, LL> > se;
set< pair<LL, LL> >::iterator it;
int vis[3002]={0};
void exmin(LL a)
{
    LL x,des,val,min=INF;
    for(x=0;x<v[a].size();x++)
    {
        if(v[a][x]<min)
        {
            val=v[a][x];
            des=x;
            min=val;
        }
    }
    se.insert(mp(val,des));
}


int main() {

  fast
  LL n,m,x,i,j,k,wt=0,s;
  cin>>n>>m;
  vector<int> ve;
  for(x=1;x<=n;x++)
     ve.pb(x);
  for(x=0;x<m;x++)
  {
    cin>>i>>j>>k;
    if(v[i][j]!=-1)
    {
        if(v[i][j]>k)
        {
            v[i][j]=k;
            v[j][i]=k;
          }
      }
      else
      {
        v[i][j]=k;
        v[j][i]=k;
      }

  }
  cin>>s;
  ve.erase(ve.begin()+s-1);
  while(ve.size()!=0)
  {
    for(x=0;x<v[s].size();x++)
    {
        if(v[s][x]!=-1 && vis[x]!=1)
        {
            exmin(x);
          }
    }
/*  for(x=0;x<p.size();x++)
    {

    }*/

    it=se.begin();
    wt=wt+*(it).ff;
    s=*(it).ss;
    vis[*(it).ss]=1;
    ve.erase(ve.begin()+*(it).ss-1);

    se.erase(it);
  }

return 0;
}

仍面临错误。
我正在尝试实施 Prim的算法 无法包含行号,因此将错误与行本身一起附加 对不起,但无法帮助包括&#34;令人憎恶的部分&#34;因为错误在那部分。

编辑: 发现我的错误,这是一个语法错误。

2 个答案:

答案 0 :(得分:0)

虽然您有一个全局集s

set< pair<LL, LL> > s;

您还定义了long long类型的局部变量s

LL n,m,x,i,j,k,wt=0,s;

隐藏全局s。显然,long long既没有begin也没有erase成员函数,因为它是原始类型。因此错误:

 it=s.begin();    //error: request for member 'begin' in 's', which is of non-class type 'long long int'

 s.erase(it);  //error: request for member 'erase' in 's', which is of non-class type 'long long int'

要引用全局s,请使用::s,即

::s.erase(it);

最后我要指出这个&#34; contestese&#34;你正在使用的编码风格令人憎恶。您可以随意在竞赛期间使用它,但是当您在SO上发布问题时请将其编辑。

答案 1 :(得分:0)

在我的代码中发现了错误。

wt=wt+*(it).ff;

而不是*(它)应该是(* it)