Time Limit: 3000MS | Memory Limit: 30000K | |
Total Submissions: 9836 | Accepted: 2665 |
Description
Input
Output
Sample Input
1 3 3 1 2 3 1 3 4 2 3 5
Sample Output
Scenario #1: 4
Source
就是求最大生成树的最小边
WA了好多次,因为输出格式的那个冒号丢了。。。。
接着还有就是那个判断成立的条件,只有当1和N在同一个集合里才叫做完成,而不是1和N都出现过
注意输出和上面这一点,就能马上过了
#include<cstdio>
#include<cstring>
#include<algorithm>
const int E=1001*1001+10;
const int V=1010;
using namespace std;
int n,m;
int p[V];
struct EDGE
{
int x,y,v;
} edge[E*2];
bool cmp(EDGE a,EDGE b)
{
return a.v>b.v;
}
int getfather(int a)
{
if(a!=p[a]) p[a]=getfather(p[a]);
return p[a];
}
void Union(int a,int b)
{
a=getfather(a);
b=getfather(b);
p[a]=b;
}
int main()
{
int T;
scanf("%d",&T);
int cas=1;
while(T--)
{
scanf("%d%d",&n,&m);
for(int i=1; i<=n; i++) p[i]=i;
for(int i=0; i<m; i++)
{
scanf("%d%d%d",&edge[i].x,&edge[i].y,&edge[i].v);
}
sort(edge,edge+m,cmp);
bool f1=false,f2=false;
for(int i=0; i<m; i++)
{
int a=getfather(edge[i].x);
int b=getfather(edge[i].y);
if(a!=b)
{
Union(edge[i].x,edge[i].y);
}
a=getfather(1);
b=getfather(n);
if(a==b)
{
printf("Scenario #%d:/n",cas++);
printf("%d/n",edge[i].v);
printf("/n");
break;
}
}
}
return 0;
}