这个真的太水了——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. java基础(十一) 枚举类型

    枚举类型Enum的简介 1.什么是枚举类型 枚举类型: 就是由一组具有名的值的有限集合组成新的类型.(即新的类). 好像还是不懂,别急,咱们先来看一下 为什么要引入枚举类型 在没有引入枚举类型前,当我 ...

  2. Python+Selenium笔记(四):unittest的Test Suite(测试套件)

    (一) Test Suite测试套件 一个测试套件是多个测试或测试用例的集合,是针对被测程序的对应的功能和模块创建的一组测试,一个测试套件内的测试用例将一起执行. 应用unittest的TestSui ...

  3. 标准JSF的生命周期

    JavaServer Faces (JSF) 是一种用于构建Java Web 应用程序的标准框架.它提供了一种以组件为中心的用户界面(UI)构建方法,从而简化了Java服务器端应用程序的开发.它的生命 ...

  4. java io详解(1)

    一.java io结构图 二.java io的开始:文件 三.字节流: 一.java io结构图 流分类: 1.Java的字节流    InputStream是所有字节输入流的祖先,而OutputSt ...

  5. Prometheus Node_exporter 之 Network Netstat

    Network Netstat /proc/net/netstat 1. Netstat IP In / Out type: GraphUnit: shortLabel: Datagrams out ...

  6. Knockout学习,添加模板,事件,Mouseover,mouseout

    <div class="rtitle">我的收藏</div> <div class="list_ul" data-bind=&qu ...

  7. 如何用SQL脚本在SQL Server Replication中创建合并复制,以及怎么创建分区合并复制

    假设我们要创建合并复制的发布端数据库是EFDemo其中有四张表,订阅端数据库是EFDemoSubscription,如下图所示: 首先创建发布端快照代理Sql agent job:"EFDe ...

  8. 光杆mdf文件的导入

    场景,准备学习SSAS的时候,按照教程在微软下载了示例数据库AdventureWorksDW2012,下载来才发现只有一个mdf文件. 正好今天群里有位兄弟也碰到差不多的问题,客户数据库里的ldf文件 ...

  9. Georgia Tech Online Master of Science in Computer Science 项目经验分享

    Georgia Tech Online Master of Science in Computer Science 项目经验分享 Posted on 2014/04/22 项目关键词:工科名校,计算机 ...

  10. Don't Dismiss Georgia Tech's $6,600 Online Master's Degree

    https://www.pcmag.com/commentary/343924/dont-dismiss-georgia-techs-6-600-online-masters-degree Don't ...