| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
此题边权有0的情况,prime邻接矩阵O(n^2)#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
#define maxn 105
#define INF 9999999
int edge[maxn][maxn];
int max_value[maxn][maxn];//生成树中任意两个顶点之间路径的最大值
int dis[maxn],link[maxn];
bool visit[maxn],judge[maxn][maxn];//记录生成树中那些边构成
int n,m,ans;
void prime()
{
ans=0;
memset(visit,0,sizeof(visit));
memset(judge,0,sizeof(judge));
for(int i=2;i<=n;i++)
{
dis[i]=INF;
link[i]=0;
if(edge[1][i]!=-1)
{
dis[i]=edge[1][i];
link[i]=1;
}
}
link[1]=0;
dis[1]=0;
visit[1]=1;
for(int i=1;i<n;i++)
{
int min=INF;
int index=-1;
for(int i=1;i<=n;i++)
{
if(!visit[i]&&min>dis[i])
{
min=dis[i];
index=i;
}
}
ans+=min;
for(int i=1;i<=n;i++)
{
if(visit[i])
{
max_value[i][index]=max(edge[index][link[index]],max_value[link[index]][i]);
max_value[index][i]=max_value[i][index];
}
}
judge[index][link[index]]=1;
judge[link[index]][index]=1;
visit[index]=1;
for(int i=1;i<=n;i++)
{
if(!visit[i]&&edge[index][i]!=-1)
{
if(dis[i]>edge[index][i])
{
dis[i]=edge[index][i];
link[i]=index;
}
}
}
}
}
int main()
{
int cas;
scanf("%d",&cas);
while(cas--)
{
memset(edge,-1,sizeof(edge));
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
if(edge[a][b]==-1||edge[a][b]>c)
{
edge[a][b]=c;
edge[b][a]=c;
}
}
prime();
bool flag=0;
for(int i=1;i<=n;i++)
{
if(flag)break;
for(int j=1;j<=n;j++)
{
if(edge[i][j]!=-1&&!judge[i][j])
{
if(max_value[i][j]==edge[i][j])
{
flag=1;
break;
}
}
}
}
if(flag)printf("Not Unique!\n");
else printf("%d\n",ans);
}
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator