不是偶搞另类,那个克鲁斯卡尔算法叫起来好好拗口,KK就朗朗多了。这个T,Special Judge。。。主要是KK算法,好久没写CSDN,随便来点什么。上码子: #include<iostream> #include<cstring> #include<queue> #include<vector> using namespace std; const int pzjay=1013; int root[pzjay]; struct pp { int beg; int end; int val; bool operator<(const pp &a)const { return a.val<val; } }; priority_queue <pp> q; vector <pp> ve; vector <pp>::iterator it; int Find(int x) { int i=x; while(i!=root[i]) i=root[i]; while(i!=root[x]) { x=root[x]; root[x]=i; } return i; } void Union(int a,int b) { a=Find(a); b=Find(b); if(a!=b) root[a]=b; } void KK() { pp mm; int nim=-1; while(!q.empty()) { mm=q.top(); q.pop(); if(Find(mm.beg)!=Find(mm.end)) { ve.push_back(mm);//将树中的边的点存入向量等候输出 if(nim<mm.val) nim=mm.val;//要求输出生成的树中权值最大的,故找最大的 Union(mm.beg,mm.end); } } printf("%d/n%u/n",nim,ve.size());//这里输出的信息分别是树中最大的权值和边数 for(it=ve.begin();it!=ve.end();it++) printf("%d %d/n",(*it).beg,(*it).end); } int main() { int n,m; scanf("%d%d",&n,&m); for(int i=0;i<=n;++i) root[i]=i; pp plmm; while(m--) { scanf("%d%d%d",&plmm.beg,&plmm.end,&plmm.val); q.push(plmm); plmm.beg^=plmm.end; plmm.end^=plmm.beg; plmm.beg^=plmm.end; q.push(plmm); } KK(); return false; }