这个真的太水了——MST专辑。

  如果不会MST的两种算法的同学可以出门右转了。

  大致讲一下,第一题我是用Prim+堆优化的(毕竟点比较多),后面三题用的是Kruskal(习惯打,而且并查集常数实在小)

  前三题是裸题,最后一题要BFS预处理图上两点间的最短距离再跑Kruskal,稍微麻烦了点

  按顺序贴自己看吧(第四题数据有坑,数组要开大)

  1789CODE

#include<cstdio>
#include<string>
#include<queue>
#include<iostream>
#include<cstring>
using namespace std;
const int N=;
struct data
{
int x,num;
bool operator <(const data s) const
{
return s.x<x;
}
};
struct edge
{
int to,next,v;
}e[N*N];
priority_queue <data> tree;
int head[N],dis[N],n,i,j,k,ans;
string s[N];
bool vis[N];
inline int calc(int x,int y)
{
int res=;
for (int i=;i<s[x].size();++i)
if (s[x][i]!=s[y][i]) res++;
return res;
}
inline void add(int x,int y,int z)
{
e[++k].to=y; e[k].v=z; e[k].next=head[x]; head[x]=k;
}
int main()
{
for (;;)
{
memset(e,-,sizeof(e));
memset(head,-,sizeof(head));
memset(vis,,sizeof(vis));
memset(dis,,sizeof(dis));
cin>>n; k=ans=;
if (!n) break;
for (i=;i<=n;++i)
cin>>s[i];
for (i=;i<n;++i)
for (j=i+;j<=n;++j)
{
int res=calc(i,j);
add(i,j,res); add(j,i,res);
}
dis[]=;
data p;
p.x=; p.num=;
tree.push(p);
while (!tree.empty())
{
int now=tree.top().num;
tree.pop();
if (vis[now]) continue;
vis[now]=; ans+=dis[now];
for (i=head[now];i!=-;i=e[i].next)
if (e[i].v<dis[e[i].to])
{
dis[e[i].to]=e[i].v;
data p;
p.x=dis[e[i].to]; p.num=e[i].to;
tree.push(p);
} }
printf("The highest possible quality is 1/%d.\n",ans);
}
return ;
}

  2485CODE

#include<cstdio>
#include<algorithm>
using namespace std;
const int N=;
struct data
{
int x,y,s;
}a[N*N];
int t,n,i,j,k,x,father[N],ans;
inline void read(int &x)
{
x=; char ch=getchar();
while (ch<''||ch>'') ch=getchar();
while (ch>=''&&ch<='') x=x*+ch-'',ch=getchar();
}
inline void write(int x)
{
if (x/) write(x/);
putchar(x%+'');
}
inline int comp(data a,data b)
{
return a.s<b.s;
}
inline int getfather(int k)
{
return father[k]==k?k:father[k]=getfather(father[k]);
}
int main()
{
read(t);
while (t--)
{
read(n);
ans=k=;
for (i=;i<=n;++i)
for (j=;j<=n;++j)
{
read(x);
if (i==j) continue;
a[++k].x=i; a[k].y=j; a[k].s=x;
}
sort(a+,a+k+,comp);
for (i=;i<=n;++i)
father[i]=i;
for (i=;i<=k;++i)
{
int fx=getfather(a[i].x),fy=getfather(a[i].y);
if (fx!=fy)
{
ans=a[i].s;
father[fx]=fy;
}
}
write(ans); putchar('\n');
}
return ;
}

  

  1258CODE

#include<cstdio>
#include<algorithm>
using namespace std;
const int N=;
struct data
{
int x,y,s;
}a[N*N];
int n,i,j,k,x,father[N],ans;
inline void read(int &x)
{
x=; char ch=getchar();
while (ch<''||ch>'') ch=getchar();
while (ch>=''&&ch<='') x=x*+ch-'',ch=getchar();
}
inline void write(int x)
{
if (x/) write(x/);
putchar(x%+'');
}
inline int comp(data a,data b)
{
return a.s<b.s;
}
inline int getfather(int k)
{
return father[k]==k?k:father[k]=getfather(father[k]);
}
int main()
{
while (scanf("%d",&n)!=EOF)
{
ans=k=;
for (i=;i<=n;++i)
for (j=;j<=n;++j)
{
read(x);
if (i==j) continue;
a[++k].x=i; a[k].y=j; a[k].s=x;
}
sort(a+,a+k+,comp);
for (i=;i<=n;++i)
father[i]=i;
for (i=;i<=k;++i)
{
int fx=getfather(a[i].x),fy=getfather(a[i].y);
if (fx!=fy)
{
ans+=a[i].s;
father[fx]=fy;
}
}
write(ans); putchar('\n');
}
return ;
}

  3026CODE

#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int N=,fx[]={,,-,},fy[]={,,,-};
struct data
{
int x,y,s;
}e[N*N];
int i,j,n,m,t,k,q[N*N*][],step[N][N],father[N*N],ans;
bool vis[N][N];
char a[N][N];
inline void BFS(int x,int y)
{
int head=,tail=;
memset(vis,,sizeof(vis));
q[][]=x; q[][]=y; vis[x][y]=; step[x][y]=;
while (head<tail)
{
int xx=q[++head][],yy=q[head][];
if (a[xx][yy]=='S'||a[xx][yy]=='A') e[++k].x=(x-)*m+y,e[k].y=(xx-)*m+yy,e[k].s=step[xx][yy];
for (int i=;i<;++i)
{
int xxx=xx+fx[i],yyy=yy+fy[i];
if (!vis[xxx][yyy]&&a[xxx][yyy]!='#'&&xxx>&&yyy>&&xxx<=n&&yyy<=m)
{
vis[xxx][yyy]=;
step[xxx][yyy]=step[xx][yy]+;
q[++tail][]=xxx; q[tail][]=yyy;
}
}
}
}
inline int comp(data a,data b)
{
return a.s<b.s;
}
inline int getfather(int k)
{
return father[k]==k?k:father[k]=getfather(father[k]);
}
int main()
{
scanf("%d\n",&t);
while (t--)
{
scanf("%d%d\n",&m,&n);
for (k=,ans=,i=;i<=n*m;++i)
father[i]=i;
for (i=;i<=n;++i)
{
for (j=;j<=m;++j)
a[i][j]=getchar();
getchar();
}
for (i=;i<=n;++i)
for (j=;j<=m;++j)
if (a[i][j]=='S'||a[i][j]=='A') BFS(i,j);
sort(e+,e+k+,comp);
for (i=;i<=k;++i)
{
int fax=getfather(e[i].x),fay=getfather(e[i].y);
if (fax!=fay)
{
ans+=e[i].s;
father[fax]=fay;
}
}
printf("%d\n",ans);
}
}

POJ 1789&&2485&&1258&&3026的更多相关文章

  1. poj 1789 prime

    链接:Truck History - POJ 1789 - Virtual Judge  https://vjudge.net/problem/POJ-1789 题意:先给出一个n,代表接下来字符串的 ...

  2. Kuskal/Prim POJ 1789 Truck History

    题目传送门 题意:给出n个长度为7的字符串,一个字符串到另一个的距离为不同的字符数,问所有连通的最小代价是多少 分析:Kuskal/Prim: 先用并查集做,简单好写,然而效率并不高,稠密图应该用Pr ...

  3. POJ 1789 -- Truck History(Prim)

     POJ 1789 -- Truck History Prim求分母的最小.即求最小生成树 #include<iostream> #include<cstring> #incl ...

  4. POJ 1789 Truck History (Kruskal)

    题目链接:POJ 1789 Description Advanced Cargo Movement, Ltd. uses trucks of different types. Some trucks ...

  5. poj 1789

    http://poj.org/problem?id=1789 这是一道图论的题,个人觉得和那个POJ1258是差不多的,就是多了一步,题目难以读懂 题目的意思:就是给你一群字符串要你找字符串对应的字符 ...

  6. poj 1789 Truck History

    题目连接 http://poj.org/problem?id=1789 Truck History Description Advanced Cargo Movement, Ltd. uses tru ...

  7. poj 1789 Truck History(最小生成树)

    模板题 题目:http://poj.org/problem?id=1789 题意:有n个型号,每个型号有7个字母代表其型号,每个型号之间的差异是他们字符串中对应字母不同的个数d[ta,tb]代表a,b ...

  8. poj 1789 Truck History(kruskal算法)

    主题链接:http://poj.org/problem?id=1789 思维:一个一个点,每两行之间不懂得字符个数就看做是权值.然后用kruskal算法计算出最小生成树 我写了两个代码一个是用优先队列 ...

  9. POJ 1789 Truck History (Kruskal 最小生成树)

    题目链接:http://poj.org/problem?id=1789 Advanced Cargo Movement, Ltd. uses trucks of different types. So ...

随机推荐

  1. mysql中删除同一行会经常出现死锁?太可怕了

    之前有一个同事问到我,为什么多个线程同时去做删除同一行数据的操作,老是报死锁,在线上已经出现好多次了,我问了他几个问题:   1. 是不是在一个事务中做了好几件事情?      答:不是,只做一个删除 ...

  2. winform调用jar包

    因为工作需要,需要做一个数据上传的程序,客户规定的是:数据接口采用http连接,采用JSON-RPC轻量级远程调用协议.所以决定用winform做一个管理界面(其中还包括其他的功能),java完成数据 ...

  3. Another reason why SQL_SLAVE_SKIP_COUNTER is bad in MySQL

    It is everywhere in the world of MySQL that if your replication is broken because an event caused a ...

  4. 【转载】Please configure Android Sdk(android studio)解决办法

    https://blog.csdn.net/u011622280/article/details/79005453 studio就报Please configure Android Sdk,重启and ...

  5. 49_分析代理类的作用与原理及AOP概念

    生活中的代理 武汉人从武汉的代理商手中买联想电脑和直接跑到北京传智播客旁边来找联想总部买电脑,你觉得最终的主体业务目标有什么区别吗?基本上一样吧,都解决了核心问题,但是,一点区别都没有吗?从代理商那里 ...

  6. linux 文本操作

    sed -i 直接修改 sed 是负责插入替换删除字符串操作. sed -n '/11/p' 11.txt |sed  's/11/33333/g'  查找11并替换11位3333 sed  's/1 ...

  7. sed和awk学习整理

    Awk和Sed的基本使用 可以用大至相同的方式调用sed 和awk .命令行讲法是:command [options] script filename几乎和所有的unlx程序一样,sed和awk都可以 ...

  8. Ecstore Nginx Rewrite(去掉链接中的index.php) ECSTORE 伪静态

    一.修改 nginx.conf文件,添加如下代码: if ($request_uri ~ (.+?\.php)(|/.+)$ ){ break; } if (!-e $request_filename ...

  9. jQuery 1.11 / 2.1 beta 版发布

    jQuery开发团队近日发布了jQuery 1.11和2.1的beta版本. jQuery 1.x版本支持IE 6/7/8,jQuery 2.x 不支持,如果你已经抛弃了IE 6/7/8用户,可以升级 ...

  10. DOM操作XML文件

    一.IE中的XML(IE低版本才支持) 在统一的正式规范出来以前,浏览器对于 XML 的解决方案各不相同.DOM2 级提出了动态创建 XML DOM 规范,DOM3 进一步增强了 XML DOM. 所 ...