實現了一個prim,然後胡亂套到題裏面
對於不聯通的情況,胡亂判斷一下居然ac了
#include <bits/stdc++.h>
using namespace std;
const int maxn=10000;
int main()
{
int dist[maxn];
bool ontree[maxn];
vector< pair<int,int> >g[maxn];
//輸入
int n,vt;
while(cin>>vt>>n,vt!=0)
{
int st,en,le;
for(int i=0;i<=n;i++)g[i].clear();
while(vt--)
{cin>>st>>en>>le;
// if(g[st].size()>g[st].capacity()-2)g[st].reserve(2*g[st].size()+1);
int sz=g[st].size();
if(g[st].size()==0)g[st].push_back(make_pair(0,0));
g[st].push_back( make_pair(en,le) );
// sz=g[st].size();
// cout<<g[st][sz-1].first<<" "<<g[st][sz-1].second<<" "<<sz<<endl;
}
//prim
{
//初始話
for(int i=1;i<=n;i++)dist[i]=INFINITY;
memset(ontree,0,sizeof(ontree));
dist[1]=0;
int su=0;
for(int i=1;i<=n;i++)
{
//找點
int mark=-1;
for(int j=1;j<=n;j++)
if(!ontree[j])
if(mark==-1)mark=j;
else if(dist[mark]>dist[j])mark=j;
if(mark==-1)break;//終點
//更新
ontree[mark]=1;
su+=dist[mark];
// cout<<mark<<" "<<dist[mark]<<endl;
//鬆弛
for(int j=0;j<g[mark].size();j++)
{
if(!ontree[g[mark][j].first])
{
if(dist[g[mark][j].first]>g[mark][j].second)dist[g[mark][j].first]=g[mark][j].second;
}
}
}if(su<0)cout<<"?"<<endl;
else cout<<su<<endl;
}
}
return 0;
}