100 条题解
-
2
Lifi LV 10 @ 5 年前
1.生成最小生成树,并记录生成树的所以边。输出第一个答案。
2.逐个在边集中剔除最小生成树的某个边,并重新生成除去该边后的最小生成树,直至所有边都去除过一次为止。有n-1条边,剔除n-1次,共得到n-1棵最小生成树。
3.取n-1棵树中的最小值为此小生成树。 -
27 年前@
-
06 年前@
PowderHan的代码是有BUG的。数据太弱没显示出来。
按照他的代码,会出现某一个点不连通而次小生成树不为-1.
比如下列数据
7 8
2 3 40
3 5 81
7 4 78
1 5 42
4 3 99
3 7 98
4 1 56
1 3 27 -
0
-
012 年前@
为什么kruskal求出来的次小生成树比最小生成树还小 代码如下
#include<iostream>
#include<cstdio>
#include<ctime>
#include<algorithm>
using namespace std;
struct self{int x,y;long long c;};
self s[250001];
int a,b,m,n;
long long z=0;
int f[250001];
int use[250001];
bool firstuse[250001]={0};int find(int i)
{
return f[i]==i?i:f[i]=find(f[i]);
}int cmp(self a1,self a2)
{
return a1.c<a2.c;
}
long long kruskal1()
{
long long z=0;
int y=0;
for(int k=1;k<=n;k++)
{
int l=find(s[k].x);
int r=find(s[k].y);
if(l!=r)
{
firstuse[k]=1;
f[l]=r;
z+=s[k].c;
y++;
if(y==m-1)return z;}
}
return z;
}
long long kruskal()
{
long long z=0;
int y=0;
for(int k=1;k<=n;k++)
if(use[k])
{
int l=find(s[k].x);
int r=find(s[k].y);
if(l!=r)
{
f[l]=r;
z+=s[k].c;
y++;
if(y==m-1)return z;
}}
return z;
}int main()
{
ios::sync_with_stdio(false);
//freopen("1.in","r",stdin);cin>>m>>n;
for(a=1;a<=n;a++)
{
f[a]=a;
cin>>s[a].x>>s[a].y>>s[a].c;
use[a]=1;
}
sort(s+1,s+n+1,cmp);if(n<m-1)
{
cout<<"Cost: "<<-1<<endl;
cout<<"Cost: "<<-1<<endl;
return 0;
}z=kruskal1();
cout<<"Cost: "<<z<<endl;if(n-1<m-1)
{
cout<<"Cost: "<<-1<<endl;
return 0;
}long long T=999999999999;
for(a=1;a<=n;a++)
if(firstuse[a]==1)
{
for(b=1;b<=n;b++)f[b]=b;
use[a]=false;
long long k=kruskal();
if(k<T&&k>=z)T=k;
use[a]=true;
}cout<<"Cost: "<<T<<endl;
return 0;
}另外最后几组如何优化 我是纯暴力删边枚举的 不知道那些0ms 10ms的怎么过的
求并查集删边枚举的代码 谢了! -
012 年前@
-
015 年前@
kao! iostream超时!
cstdio ac!
没天理 我的ac率啊 -
015 年前@
没秒杀......囧~~~~
-
015 年前@
编译通过...
├ 测试数据 01:答案正确... 0ms
├ 测试数据 02:答案正确... 0ms
├ 测试数据 03:答案正确... 0ms
├ 测试数据 04:答案正确... 0ms
├ 测试数据 05:答案正确... 0ms
├ 测试数据 06:答案正确... 0ms
├ 测试数据 07:答案正确... 0ms
├ 测试数据 08:答案正确... 0ms
├ 测试数据 09:答案正确... 0ms
├ 测试数据 10:答案正确... 9ms
---|---|---|---|---|---|---|---|-
Accepted 有效得分:100 有效耗时:9msO(N^2)的prim算法,不过写丑了,没能秒杀
-
015 年前@
汗死、、我就奇怪 O(N*M) 怎么能AC=。= 原来是O(M)的 。。无数次的TLE之后
编译通过...
├ 测试数据 01:答案正确... 0ms
├ 测试数据 02:答案正确... 0ms
├ 测试数据 03:答案正确... 0ms
├ 测试数据 04:答案正确... 0ms
├ 测试数据 05:答案正确... 0ms
├ 测试数据 06:答案正确... 0ms
├ 测试数据 07:答案正确... 0ms
├ 测试数据 08:答案正确... 9ms
├ 测试数据 09:答案正确... 9ms
├ 测试数据 10:答案正确... 41ms
---|---|---|---|---|---|---|---|-
Accepted 有效得分:100 有效耗时:59ms -
015 年前@
编译通过...
├ 测试数据 01:答案正确... 0ms
├ 测试数据 02:答案正确... 0ms
├ 测试数据 03:答案正确... 0ms
├ 测试数据 04:答案正确... 0ms
├ 测试数据 05:答案正确... 0ms
├ 测试数据 06:答案正确... 0ms
├ 测试数据 07:答案正确... 0ms
├ 测试数据 08:答案正确... 0ms
├ 测试数据 09:答案正确... 25ms
├ 测试数据 10:答案正确... 72ms
---|---|---|---|---|---|---|---|-
Accepted 有效得分:100 有效耗时:97ms
吐血 -
015 年前@
编译通过...
├ 测试数据 01:答案正确... 0ms
├ 测试数据 02:答案正确... 0ms
├ 测试数据 03:答案正确... 0ms
├ 测试数据 04:答案正确... 0ms
├ 测试数据 05:答案正确... 0ms
├ 测试数据 06:答案正确... 0ms
├ 测试数据 07:答案正确... 0ms
├ 测试数据 08:答案正确... 0ms
├ 测试数据 09:答案正确... 25ms
├ 测试数据 10:答案正确... 56ms
---|---|---|---|---|---|---|---|-
Accepted 有效得分:100 有效耗时:81ms
先求MST,再穷举,删去MST中的每一条边,求出最小值,就是次小MST -
015 年前@
.......一道题卡了我一下午......忍不住要贴个代码
program vijos1070(input,output);
var
a,f:array[1..501,1..501] of longint;
used:array[1..501] of boolean;
v,s,i,j,k,n,m,m1,min,mini,x,y,z:longint;
dis,father:array[1..501] of longint;
sum:longint;
st,fi:array[1..501] of longint;
b:array[0..501,0..501] of boolean;
function max(a,b:longint):longint;
begin
if a>b then max:=a else max:=b;
end;
{---|---|---|-main---|---|---|---|-}
begin
fillchar(b,sizeof(b),false);
read(n,m);
fillchar(f,sizeof(f),0);
fillchar(used,sizeof(used),false);
for i:=1 to n do
for j:=1 to n do
a:=maxlongint;
for i:=1 to m do
begin
read(x,y,z);
a[x,y]:=z;
a[y,x]:=z;
end;
for i:=1 to n do
dis[i]:=maxlongint;
dis[1]:=0;
s:=1;
x:=1;
sum:=0;
used:=true;
for i:=1 to n do
if amaxlongint then begin
dis[i]:=a;father[i]:=s;end
else father[i]:=-1;
dis:=0;
father:=-1;
while x -
015 年前@
n^3 的 prim 为什么 超时 7个点?
-
015 年前@
编译通过...
├ 测试数据 01:答案正确... 0ms
├ 测试数据 02:答案正确... 0ms
├ 测试数据 03:答案正确... 0ms
├ 测试数据 04:答案正确... 0ms
├ 测试数据 05:答案正确... 0ms
├ 测试数据 06:答案正确... 0ms
├ 测试数据 07:答案正确... 0ms
├ 测试数据 08:答案正确... 56ms
├ 测试数据 09:答案正确... 181ms
├ 测试数据 10:答案正确... 150ms
---|---|---|---|---|---|---|---|-
Accepted 有效得分:100 有效耗时:387ms好慢!
-
015 年前@
我的算法,(N^2)的,速度超快,可惜只过了8个点:
var
g:array[0..500,0..500]of extended;
a,b:array[1..500]of integer;
vd:array[1..500]of boolean;
n,m,i,j,k,t:longint;
c1,c2,l:extended;
begin
readln(n,m);
for i:=0 to n do
for j:=0 to n do
g:=1e30;
fillchar(a,sizeof(a),0);
fillchar(b,sizeof(b),0);
for i:=1 to m do
begin
readln(j,k,g[j,k]);
g[k,j]:=g[j,k];
if j=1 then
a[k]:=1;
if k=1 then
a[j]:=1;
end;fillchar(vd,sizeof(vd),false);
vd[1]:=true;
c1:=0;
c2:=1e30;
for t:=2 to n do
begin
k:=0;
l:=1e30;
for i:=1 to n do
if(not vd[i])and(g -
016 年前@
我用prim竟然超时。。。
-
016 年前@
Accepted 有效得分:100 有效耗时:325ms
kruskal+删边
天啊!最大值一定要赋到2147483647!!
血的教训,提交了n多次!! -
016 年前@
次小生成树
删边后再做一个最小生成树 -
016 年前@
WA#4的注意:
有可能删掉一条边后没有生成树
直接更新的话答案会偏小
判断一下就行