POJ 1789&&2485&&1258&&3026
这个真的太水了——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的更多相关文章
- poj 1789 prime
链接:Truck History - POJ 1789 - Virtual Judge https://vjudge.net/problem/POJ-1789 题意:先给出一个n,代表接下来字符串的 ...
- Kuskal/Prim POJ 1789 Truck History
题目传送门 题意:给出n个长度为7的字符串,一个字符串到另一个的距离为不同的字符数,问所有连通的最小代价是多少 分析:Kuskal/Prim: 先用并查集做,简单好写,然而效率并不高,稠密图应该用Pr ...
- POJ 1789 -- Truck History(Prim)
POJ 1789 -- Truck History Prim求分母的最小.即求最小生成树 #include<iostream> #include<cstring> #incl ...
- POJ 1789 Truck History (Kruskal)
题目链接:POJ 1789 Description Advanced Cargo Movement, Ltd. uses trucks of different types. Some trucks ...
- poj 1789
http://poj.org/problem?id=1789 这是一道图论的题,个人觉得和那个POJ1258是差不多的,就是多了一步,题目难以读懂 题目的意思:就是给你一群字符串要你找字符串对应的字符 ...
- poj 1789 Truck History
题目连接 http://poj.org/problem?id=1789 Truck History Description Advanced Cargo Movement, Ltd. uses tru ...
- poj 1789 Truck History(最小生成树)
模板题 题目:http://poj.org/problem?id=1789 题意:有n个型号,每个型号有7个字母代表其型号,每个型号之间的差异是他们字符串中对应字母不同的个数d[ta,tb]代表a,b ...
- poj 1789 Truck History(kruskal算法)
主题链接:http://poj.org/problem?id=1789 思维:一个一个点,每两行之间不懂得字符个数就看做是权值.然后用kruskal算法计算出最小生成树 我写了两个代码一个是用优先队列 ...
- POJ 1789 Truck History (Kruskal 最小生成树)
题目链接:http://poj.org/problem?id=1789 Advanced Cargo Movement, Ltd. uses trucks of different types. So ...
随机推荐
- 用AndroidStudio创建so
Android开发中经常遇到so,下面介绍用Android Studio创建so.Android Studio版本3.0.1. 一 编写代码 1 创建java类myJNI.java,并且声明一个nat ...
- Oracle EBS AR 客户API
------------------------------------ 1. Set Environment ------------------------------------ -- 1a. ...
- SQL Server如何附加只有mdf的数据库文件
有时候SQL Server意外断电会导致SQL Server的ldf日志文件丢失或者损坏,这个时候你如果直接附加mdf文件到SQL Server会失败,这里提供一个方法可以还原只有mdf的数据库文件, ...
- 表迁移工具的选型-复制ibd的方法-传输表空间
1.1. 场景 有的时候开放人员自己的库需要帮忙导一些数据,但是表的数据量又很大.虽然说使用mysqldump或mysqlpump也可以导.但是这耗时需要比较久. 记得之前建议开放人员可以直接使用na ...
- centos 7 linux x64
1.修改软件源 sudo wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo yum updat ...
- fatal: cannot create directoryxxxx': Invalid argument
问题:fatal: cannot create directoryxxxx': Invalid argument 环境:git 拉取远程仓库的代码后 原因:同事是mac,这个文件夹命名规则在苹果上没有 ...
- pt-table-checksum工具MySQL主从复制数据一致性
所使用的工具是pt-table-checksum 原理是: 在主上执行检查语句去检查 mysql主从复制的一致性,生成 replace 语句,然后通过复制传递到从库,再通过update 更新 mast ...
- 12.SolrCloud原理
转载自http://blog.csdn.net/u011026968/article/details/50336709 内容涉及:SolrCloud的基础知识.架构.索引创建和更新.查询.故障恢复.负 ...
- tarjan【模板】缩点
传送门:https://www.luogu.org/problemnew/show/P3387 首先呢,tarjan找一个图的强连通分量是基于对图的dfs的.这中间开了一个dfn[]代表dfs序,还有 ...
- OpenCV——模板匹配
minMaxLoc函数: void minMaxLoc( const Mat& src, double* minVal, double* maxVal=0, Point* minLoc=0, ...