做了十来道了,基本都挺水的,主要自己傻,各种数组开小,RE了不少
zoj 1586
题意:貌似就是说给出了许多QS之间的路,然后QS每次只能用一次(每次都有花费)
题解:就是边的权值还得加上两点的花费(都是题意难以理解)
for(int i=1;i<=n;i++){
scanf("%d",&val[i]);
pre[i]=i;
}
int xcount=0;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
int a;
scanf("%d",&a);
if(j>=i) continue;
p[xcount].u=i;
p[xcount].v=j;
p[xcount++].w=a+val[i]+val[j];
}
}
sort(p,p+xcount);
int sum=0;
for(int i=0;i
poj 1789
题意:给你n条字符串,每个字符串长为7,然后如果两个字符串之间同一位置字符不同的个数就是字符串的距离
题解:每次输入的时候都计算下距离,然后kruskal,好像当时脑残了数组开小了,RE了半天
for(int i=1;i<=n;i++){
pre[i]=i;
scanf("%s",s[i]);
int len=strlen(s[i]);
for(int j=1;j
poj 2349
题意:给你s个卫星,p个村庄,然后村庄之间通讯,有卫星的村庄可以不花费(我开头以为是一个卫星可以对应一条路,原来是一个卫星对应一个村庄)
题解:最小生成树,权值最大的s-1条边就用卫星(s个村庄有卫星),就是只要连n-s条边就能break了
for(int i=1;i<=s;i++){
pre[i]=i;
double x,y;
scanf("%lf%lf",&node[i].x,&node[i].y);
for(int j=1;j
poj 3026
题意:给你个迷宫,#是不能走,空格可以走,AS是几个目的地,可以看成点,然后就是这些点连起来最小花费
题解:显然kruskal,不过需要bfs算出每个点到别的点的权值,G++会T,C++能过,还有个天坑就是每行都有空格,要用gets,然后开头x,y输入完了之后后面也有空格,不能用getchar吃个回车,要用gets再吃个一行
#include
poj 1679
题意:给你点和边,求最小生成树是否唯一
题解:先求出最小生成树,把MST的边都标记,然后枚举每次去掉一条,看有没有算出来sum和MST的sum相同的
#include
最小生成树还是比较水的,我可能再去练练求MST的个数,还有就是生成树的题