2016-07-11 121 views
0
#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的算法
無法包含行號,因此將錯誤與行本身一起附加。
對不起,但不能幫助包括「可惡的部分」,因爲錯誤在那一部分。設置<pair <long long long long>>第一秒不支持成員嗎?

回答

0

雖然你有一個全球性的集s

set< pair<LL, LL> > s; 

您還定義類型的局部變量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); 

而且最後我想指出的是您正在使用這種「contestese」編碼風格是可惡。隨時在比賽期間儘可能使用它,但請在SO上發佈問題時將其編輯。

+0

謝謝!我怎麼可能錯過了,但仍然面臨一些錯誤,已更新我的代碼 – Kaustubh

0

在我的代碼中發現錯誤。

wt=wt+*(it).ff; 

,而不是*(它)它應該是(*吧)

+1

只是FYI,我們有一個特殊的'運算符 - >'在這種情況下使用。即'it-> ff'而不是'(* it).ff' –

相關問題