/*
求次最小生成树
去掉 最小生成树上的边 找当前的最小生成树 找最小生成树之外的最小生成树
*/
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
#define N 10000
#define inf 0x7fffffff
struct node
{
int s,t,w;
}edge[N],edge2[N];
int num;
int set[110];
int rank[N];
int cmp(node a,node b)
{
return a.w<b.w;
}
int find(int x)
{
if(x==set[x])
return x;
//x=set[x];
return set[x]=find(set[x]);
}
void Union(int x,int y)
{
//int x=find(edge[i].s);
// int y=find(edge[i].t);
if(x<y)
set[x]=y;
else
set[y]=x;
}
/*
int find(int x)
{
if(x!=set[x])
set[x]=find(set[x]);
return set[x];
}*/
//实现树与树的合并
/*
void Union(int x,int y) //效率 要高很多
{
x=find(x);
y=find(y);
if(rank[x]>rank[y])
set[y]=x;
else
{
set[x]=y;
if(rank[x]==rank[y])
rank[y]++;
}
}
*/
int Kruskal(int v,int e)
{
for(int i=0;i<=v;i++)
{
set[i]=i;
rank[i]=0;
}
sort(edge,edge+e,cmp);
int sum=0;
for(int i=0;i<e;i++)
{
int fx=find(edge[i].s);
int fy=find(edge[i].t);
if(fx!=fy)
{
sum += edge[i].w;
Union(fx,fy);
//printf("%d %dSSSSSSS\n",edge[i].s,edge[i].t);
edge2[num++]=edge[i];
}
}
return sum;
}
int s,t;
int Kruskal2(int v,int e)
{
for(int i=0;i<=v;i++)
set[i]=i;
sort(edge,edge+e,cmp);
int sum=0;
for( int i=0;i<e;i++)
{
int fx=find(edge[i].s);
int fy=find(edge[i].t);
if(fx!=fy)
{
if(edge[i].s==s && edge[i].t==t)
continue;
if(edge[i].t==t && edge[i].t==s)
continue;
sum += edge[i].w;
// printf("%d %dSSSS\n",s,t);
// printf("%d %dSSSSSSS\n",edge[i].s,edge[i].t);
Union(fx,fy);
}
}
return sum;
}
bool judge(int v)
{
for(int i=1;i<=v-1;i++)
if(find(i)!=find(i+1))
return false;
return true;
}
int main()
{
int tt;
int n,m;
scanf("%d",&tt);
while(tt--)
{
scanf("%d%d",&n,&m);
for(int i=0;i<m;i++)
{
scanf("%d%d%d",&edge[i].s,&edge[i].t,&edge[i].w);
}
//sort();
num=0;
int mmin=Kruskal(n,m);
// for( i=0;i<num;i++)
// printf("%d %d\n",edge2[i].s,edge2[i].t);
// printf("%d\n",num);
int min=inf;
for( int i=0;i<num;i++)
{
s=edge2[i].s;
t=edge2[i].t;
int cmin=Kruskal2(n,m);
//printf("%d++",cmin);
// printf("%d____\n",judge(n));
if(judge(n) && cmin<min)
{
min= cmin;
}
}
/// printf("%d %d\n",mmin,min);
if(min==mmin)
{
printf("Not Unique!\n");
}
else
printf("%d\n",mmin);
}
return 0;
}
poj 1679 次最小生成树
最新推荐文章于 2022-10-30 16:39:27 发布