MyBatis联动查询:
一对一映射(注解版):
/**
* @Interface:CompanyMapper
*/
@Select({
"select",
"cid, name, address, pro, city, price",
"from company",
"where cid = #{cid,jdbcType=INTEGER}"
})
@Results({
@Result(column="cid", property="cid", jdbcType=JdbcType.INTEGER, id=true),
@Result(column="name", property="name", jdbcType=JdbcType.VARCHAR),
@Result(column="address", property="address", jdbcType=JdbcType.VARCHAR),
@Result(column="pro", property="pro", jdbcType=JdbcType.VARCHAR),
@Result(column="city", property="city", jdbcType=JdbcType.VARCHAR),
@Result(column="price", property="price", jdbcType=JdbcType.INTEGER)
})
Company selectComByPrimaryKey(Integer cid);
/**
* @Interface:EmpMapper
*/
@Select({
"select",
"eid, name, sex, email, salary, cid",
"from emp",
"where eid = #{eid,jdbcType=INTEGER}"
})
@Results({
@Result(column="eid", property="eid", jdbcType=JdbcType.INTEGER, id=true),
@Result(column="name", property="name", jdbcType=JdbcType.VARCHAR),
@Result(column="sex", property="sex", jdbcType=JdbcType.VARCHAR),
@Result(column="email", property="email", jdbcType=JdbcType.VARCHAR),
@Result(column="salary", property="salary", jdbcType=JdbcType.INTEGER),
@Result(column="cid", property="cid", jdbcType=JdbcType.INTEGER),
@Result(column="cid",property="company",one = @One(select = "com.MyBatis.mapper.CompanyMapper.selectComByPrimaryKey"))
})
Emp selectComByEid(Integer eid);
一对多映射(注解版)
/**
* @Interface:CompanyMapper
*/
@Select({
"select",
"cid, name, address, pro, city, price",
"from company",
"where cid = #{cid,jdbcType=INTEGER}"
})
@Results({
@Result(column="cid", property="cid", jdbcType=JdbcType.INTEGER, id=true),
@Result(column="name", property="name", jdbcType=JdbcType.VARCHAR),
@Result(column="address", property="address", jdbcType=JdbcType.VARCHAR),
@Result(column="pro", property="pro", jdbcType=JdbcType.VARCHAR),
@Result(column="city", property="city", jdbcType=JdbcType.VARCHAR),
@Result(column="price", property="price", jdbcType=JdbcType.INTEGER),
@Result(property = "elist",javaType = List.class,column = "cid",
many = @Many(select = "com.MyBatis.mapper.EmpMapper.selectEmpByCid"))
})
Company selectEmpByPrimaryKey(Integer cid);
/**
* @Interface:EmpMapper
*/
@Select({
"select",
"eid, name, sex, email, salary, cid",
"from emp",
"where cid = #{cid,jdbcType=INTEGER}"
})
@Results({
@Result(column="eid", property="eid", jdbcType=JdbcType.INTEGER, id=true),
@Result(column="name", property="name", jdbcType=JdbcType.VARCHAR),
@Result(column="sex", property="sex", jdbcType=JdbcType.VARCHAR),
@Result(column="email", property="email", jdbcType=JdbcType.VARCHAR),
@Result(column="salary", property="salary", jdbcType=JdbcType.INTEGER),
@Result(column="cid", property="cid", jdbcType=JdbcType.INTEGER)
})
List <Emp> selectEmpByCid(Integer cid);
Prim算法:
1.概览
普里姆算法(Prim算法),图论中的一种算法,可在加权连通图里搜索最小生成树。意即由此算法搜索到的边子集所构成的树中,不但包括了连通图里的所有顶点,且其所有边的权值之和亦为最小。该算法于1930年由捷克数学家沃伊捷赫·亚尔尼克发现;并在1957年由美国计算机科学家罗伯特·普里姆独立发现;1959年,艾兹格·迪科斯彻再次发现了该算法。因此,在某些场合,普里姆算法又被称为DJP算法、亚尔尼克算法或普里姆-亚尔尼克算法。
2.算法简单描述
1).输入:一个加权连通图,其中顶点集合为V,边集合为E;
2).初始化:Vnew = {x},其中x为集合V中的任一节点(起始点),Enew = {},为空;
3).重复下列操作,直到Vnew = V:
a.在集合E中选取权值最小的边<u, v>,其中u为集合Vnew中的元素,而v不在Vnew集合当中,并且v∈V(如果存在有多条满足前述条件即具有相同权值的边,则可任意选取其中之一);
b.将v加入集合Vnew中,将<u, v>边加入集合Enew中;
4).输出:使用集合Vnew和Enew来描述所得到的最小生成树。
下面对算法的图例描述
图例 | 说明 | 不可选 | 可选 | 已选(Vnew) |
---|---|---|---|---|
此为原始的加权连通图。每条边一侧的数字代表其权值。 | - | - | - | |
顶点D被任意选为起始点。顶点A、B、E和F通过单条边与D相连。A是距离D最近的顶点,因此将A及对应边AD以高亮表示。 | C, G | A, B, E, F | D | |
下一个顶点为距离D或A最近的顶点。B距D为9,距A为7,E为15,F为6。因此,F距D或A最近,因此将顶点F与相应边DF以高亮表示。 | C, G | B, E, F | A, D | |
算法继续重复上面的步骤。距离A为7的顶点B被高亮表示。 | C | B, E, G | A, D, F | |
在当前情况下,可以在C、E与G间进行选择。C距B为8,E距B为7,G距F为11。E最近,因此将顶点E与相应边BE高亮表示。 | 无 | C, E, G | A, D, F, B | |
这里,可供选择的顶点只有C和G。C距E为5,G距E为9,故选取C,并与边EC一同高亮表示。 | 无 | C, G | A, D, F, B, E | |
顶点G是唯一剩下的顶点,它距F为11,距E为9,E最近,故高亮表示G及相应边EG。 | 无 | G | A, D, F, B, E, C | |
现在,所有顶点均已被选取,图中绿色部分即为连通图的最小生成树。在此例中,最小生成树的权值之和为39。 | 无 | 无 | A, D, F, B, E, C, G |
3.简单证明prim算法
反证法:假设prim生成的不是最小生成树
1).设prim生成的树为G0
2).假设存在Gmin使得cost(Gmin)<cost(G0) 则在Gmin中存在<u,v>不属于G0
3).将<u,v>加入G0中可得一个环,且<u,v>不是该环的最长边(这是因为<u,v>∈Gmin)
4).这与prim每次生成最短边矛盾
5).故假设不成立,命题得证.
4.算法代码实现
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int Maxn = 505;
const int Inf = 1 << 9;
int vis[Maxn];
int dis[Maxn];
int map[Maxn][Maxn];
int n;
void init()
{
for(int i=0;i<n;i++)
{
vis[i] = 0;
dis[i] = map[0][i];
}
}
int Prim()
{
init();
int ans = 0;
dis[0] = 0;
vis[0] = 1;
for(int i=0;i<n-1;i++)
{
int temp = Inf;
int flag = 0;
for(int j=0;j<n;j++)
{
if(!vis[j] && dis[j] < temp)
{
temp = dis[j];
flag = j;
}
}
vis[flag] = 1;
ans += temp;
for(int j=0;j<n;j++)
{
if(!vis[j] && map[flag][j] < dis[j])
{
dis[j] = map[flag][j];
}
}
}
return ans;
}
int main()
{
while(~scanf("%d",&n))
{
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
scanf("%d",&map[i][j]);
}
}
int ans = Prim();
printf("%d\n",ans);
}
return 0;
}
5.时间复杂度
这里记顶点数v,边数e
邻接矩阵:O(v2) 邻接表:O(elog2v)