`
touchmm
  • 浏览: 1037587 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

考研复习(9)-图的应用

 
阅读更多
1.最小生成树-普林姆算法
复杂度O(n^2),适合稠密图
#include <iostream>
#include <fstream>
#include <climits>


using namespace std;
const int maxn=101;
void prim(int n,int dist[maxn],int map[maxn][maxn],int pre[maxn])
{
int i,j,k;
int min;
bool p[maxn];
for(i=2;i<=n;i++)
{
p[i]=false;
dist[i]=map[1][i];


}
dist[1]=0;
p[1]=true;


for(i=1;i<=n-1;i++)
{
min=INT_MAX;
k=0;
for(j=1;j<=n;j++)
{
if(!p[j]&&dist[j]<min)
{
min=dist[j];
k=j;
}
}
if(k==0) return;
p[k]=true;


for(j=1;j<=n;j++)
if(!p[j]&&map[k][j]!=INT_MAX&&dist[j]>map[k][j])
{
dist[j]=map[k][j];
pre[j]=k;
}
}


}
int main()
{
int n,m;
int a,b,w;
int map[maxn][maxn];
int dist[maxn];
int pre[maxn];
int sum=0;
int i,j;


freopen("input.txt","r",stdin);
cin>>n>>m;
for(i=1;i<=n;i++)
{
pre[i]=1;
for(j=1;j<=n;j++)
{
//if(i-j) map[i][j]=INT_MAX;
//else map[i][j]=0;
map[i][j]=INT_MAX;
}
}
for(i=1;i<=m;i++)
{
cin>>a>>b>>w;
if(w<map[a][b])//deal with the repeated edge
{
map[a][b]=w;
//map[b][a]=w;//for no-orient graph
}
}
prim(n,dist,map,pre);
for(i=1;i<=n;i++)
{
if(dist[i]==INT_MAX)
{
cout<<"Can't form a mini-spanning tree!"<<endl;
return 0;
}
sum+=dist[i];
}
cout<<sum<<endl;
for(i=2;i<=n;i++) cout<<pre[i]<<"----"<<i<<endl;
cout << "Hello world!" << endl;
return 0;
}
/*difference between prim arithmetic and dijkstra arithmetic:Prim's Greedy-heart content is finding the shortest edge and union it to solution-set.Dijkstra's Greedy-heart content is findng the shortest path to the source node and union it to solution-set.

The purpose and relax content is also different.*/



2.最小生成树-克鲁斯卡尔算法
复杂度O(n^2),适合稀疏图
#include <iostream>
#include <algorithm>
#include <fstream>
using namespace std;
const int maxn=1010;//the number of node
const int maxe=100010;//the number of edge
//union and find set
struct node
{
int parent;
int depth;
}UFSTree[maxn];
struct enode
{
int a,b;//from....to...
int w;//weight
bool select;
}edge[maxe];
int find(int x)
{
if(UFSTree[x].parent!=x)
{
UFSTree[x].parent=find(UFSTree[x].parent);
}
return UFSTree[x].parent;
}
void merge(int x,int y)
{
int p,q;
p=find(x);
q=find(y);
if(p!=q)
{
if(UFSTree[p].depth>UFSTree[q].depth) UFSTree[q].parent=p;
else
{
UFSTree[p].parent=q;
if(UFSTree[p].depth==UFSTree[q].depth) UFSTree[q].depth++;
}
}
}
bool cmp(enode a,enode b)
{
if(a.w!=b.w) return a.w<b.w;
if(a.a!=b.b) return a.a<b.a;
return a.b<b.b;
}
void kruskal(enode *edge,int n,int m)
{
int k=0;//edge counter
int i,x,y;
sort(edge+1,edge+1+m,cmp);//sort edges by edge's weight at first


for(i=1;i<=m;i++)
{


if(k==n-1) break;
x=find(edge[i].a);
y=find(edge[i].b);
if(x!=y)
{
merge(x,y);
k++;
edge[i].select=true;
}
}


}
int main()
{
int i,n,m;
freopen("input.txt","r",stdin);
cin>>n>>m;
cout<<n<<m;
for(i=1;i<=m;i++)//init union&find set
{
UFSTree[i].parent=i;
UFSTree[i].depth=0;
}
for(i=1;i<=m;i++)
{
cin>>edge[i].a>>edge[i].b>>edge[i].w;
cout<<edge[i].a<<endl;
edge[i].select=false;
}
kruskal(edge,n,m);
for(i=0;i<=m;i++)
if(edge[i].select) cout<<edge[i].a<<' '<<edge[i].b<<' '<<edge[i].w<<endl;
cout << "Hello world!" << endl;
return 0;
}

//thought:A tipical greedy aruthmetic.The greedy purpose is to get the smallest edge from the rest of node to the solution-set if do not construct a circle as a result.



3。最短路-缔结思科啦算法
算单点的最短路,O(n^2)
#include <iostream>
#define INT_MAX 1000000
using namespace std;
const int maxn=1000;
void djk(int n,int dist[maxn],int map[maxn][maxn],int pre[maxn],int s)
{


int i,j,k;
int min;
bool p[maxn];
for(i=1;i<=n;i++)
{
p[i]=false;
if(i!=s) dist[i]=map[s][i];


}
dist[s]=0;
p[s]=true;


for(i=1;i<=n-1;i++)
{
min=INT_MAX;
k=0;
for(j=1;j<=n;j++)
{
if(!p[j]&&dist[j]<min)
{
min=dist[j];
k=j;


}
}


if(k==0) return;
if(i==1) pre[k]=s;
p[k]=true;
for(j=1;j<=n-1;j++)
{
if(!p[j]&&map[k][j]!=INT_MAX&&dist[j]>dist[k]+map[k][j])
{
dist[j]=dist[k]+map[k][j];//renew the distance of node j to the solution-set
pre[j]=k;
// cout<<j<<" :"<<dist[j]<<endl;
}
}


}


}
int main()
{
int i,j,s=2;
int n=6;
int dist[maxn]={0};
int pre[maxn]={0};
int map[maxn][maxn];
for(i=1;i<=n;i++)
for(j=1;j<=n;j++) map[i][j]=INT_MAX;
for(i=1;i<=n;i++) map[i][i]=0;
map[1][2]=50;map[1][3]=10;
map[1][5]=45;map[2][3]=15;
map[2][4]=50;map[2][5]=10;
map[3][1]=20;map[3][4]=15;
map[4][2]=20;map[4][5]=35;
map[5][4]=30;map[6][4]=3;
djk(n,dist,map,pre,2);


for(j=1;j<=n;j++)
{
cout<<s<<"->"<<j<<": "<<dist[j]<<endl;
}
cout << "Hello world!" << endl;
return 0;

}


4.最短路-否罗衣得算法
复杂度O(n^3)
#include <iostream>
#include <climits>
#include <fstream>
#define INT_MAX 1000000000
using namespace std;
const int maxn=101;
void floyd(int n,int map[][maxn],int min[][maxn],int pre[][maxn])
{
int i,j,k;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
min[i][j]=map[i][j];
pre[i][j]=i;
}
for(k=1;k<=n;k++)
for(i=1;i<=n;i++)
for(k=1;k<=n;k++)
{
if(min[i][k]!=INT_MAX&&min[k][j]!=INT_MAX&&min[i][k]+min[k][j]<min[i][j])
{
min[i][j]=min[i][k]+min[k][j];
pre[i][j]=pre[k][j];
}
}
}
int main()
{
int n,m;
int a,b,w;
int map[maxn][maxn];
int min[maxn][maxn];
int pre[maxn][maxn];
int i,j;


freopen("input.txt","r",stdin);
cin>>n>>m;
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
if(i-j) map[i][j]=INT_MAX;
else map[i][j]=0;
}
}
for(i=1;i<=m;i++)
{
cin>>a>>b>>w;
if(w<map[a][b])//deal with the repeated edge
{
map[a][b]=w;
//map[b][a]=w;//for no-orient graph
}
}
floyd(n,map,min,pre);
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++) cout <<i<<"->"<<j<<": "<<min[i][j]<<" ";
cout<<endl;
}
cout << "Hello world!" << endl;
return 0;
}
/*thought:A tipical Dp-question.The status transfer equation is map[i][j]=min{map[i,k]+map[k,j],map[i][j]}.So we just tranverse the edge between i and j.If fulfill the equation then relax the map[i][j];*/



分享到:
评论

相关推荐

    北京邮电大学光学专业-805物理学考研复习全书-真题-大纲-华文考研.pdf

    考生在复习时需兼顾基础理论与应用实践,尤其在物理学方面,应深入理解光学和电磁场的基本原理,通过做题和模拟训练提高解答速度和准确性。 【历年分数线与难度分析】: 虽然具体分数线和难度数据未给出,但可以...

    2011考研总复习计划-------战略战术

    【考研复习战略战术详解】 考研是一项艰巨的任务,需要科学的规划和执行。本文主要针对中等及中等偏上、中等偏下的考生提供复习策略,旨在帮助他们提高成绩。 首先,要有全局观念。理解各科目的难易程度至关重要,...

    操作系统考试考研复习课件-合肥工大

    总的来说,操作系统考研复习涵盖了操作系统的基本原理、设计方法和技术应用,要求考生具备深入理解并能够运用这些知识去分析和解决实际问题的能力。在准备考试时,考生需要全面复习这些知识点,并通过练习题和模拟...

    2019王道操作系统考研复习指导

    "2019王道操作系统考研复习指导"旨在为准备考研的同学提供一套系统、全面的复习资料,帮助他们在有限的时间内高效掌握操作系统的核心知识。 首先,我们要了解操作系统的基本概念。操作系统是管理计算机硬件与软件...

    杭州电子科技大学-计算机-考研-初试-复试-复习知识点总结.zip

    这份“杭州电子科技大学-计算机-考研-初试-复试-复习知识点总结.zip”压缩包文件,包含了历年的考研复习重点,旨在帮助考生们精准把握考试脉络,提升备考效率。 一、核心课程与基础理论 1. 数据结构:作为计算机...

    考研数学复习-数项级数.pdf

    根据所提供的文档内容,该文档似乎是一份关于考研数学复习中数项级数部分的学习资料。由于文档内容在OCR扫描识别过程中存在一些技术性错误和不完整的地方,我将尝试对其进行解读和整理,从而提取出关于数项级数的...

    2010年考研数学首轮复习知识点大汇总 - 考研信息中心-共享天下

    在考研数学的首轮复习中,考生应逐个攻破这些知识点,通过大量练习来巩固理论知识,同时注重理解和应用,提高解题能力。在这个过程中,不断反思和总结,形成自己的学习方法,将有助于在考试中取得优异成绩。加油,...

    对外汉语考研专业课复习经验-共90页.doc

    这篇文档包含了丰富的对外汉语考研复习经验和参考资料,旨在帮助考生高效备考,提升应试能力。 文档内容涵盖多个方面,如考研心得、复习策略、参考书目推荐以及具体科目的学习方法。首先,"考研北语"对外汉语部分...

    考研真题1-5

    由于具体内容并未提供实际的试题或答案,我们将基于这一主题展开,探讨考研真题在备考过程中的重要性及其如何帮助考生有效复习。 ### 考研真题的重要性 考研真题是备考过程中不可或缺的一部分,它们不仅能够帮助...

    《数据结构》考研复习精编

    根据给定的信息,我们可以推断出这是一份针对《数据结构》科目的考研复习资料,由黄明编写。下面将详细解析《数据数据结构》考研复习精编中的关键知识点及复习策略。 ### 数据结构基本概念 #### 1. 数据结构定义 ...

    考研数学公式-电脑桌面

    对于公式图片,不仅要在平时多看多记,还可以尝试自己复述和推导公式,以提高理解和应用能力。对于试卷和电子书,要定期做题,及时总结,不断反思和调整学习策略。同时,不要忽视基础概念的理解,因为许多复杂的公式...

    陈文灯考研数学复习指南答案

    《陈文灯考研数学复习指南答案》是一份全面解析高数、线性代数和概率论与数理统计课程后习题的专业参考资料。这个压缩包包含的文件名为“陈文灯复习指南答案”,旨在帮助考研学子高效备考,解决他们在学习过程中遇到...

    考研数学--必备手册(公式.概念.松记忆)--蔡子华

    蔡子华的《考研数学--必备手册》是一本集公式总结、概念解析、解题技巧、记忆方法以及大量练习为一体的综合复习资料,适合所有准备考研数学的学生使用。它不仅可以帮助学生巩固基础,还能提升解题速度和准确性,是...

    考研复习知识笔记-数据结构

    数据结构笔记-考研复习 数据结构是计算机科学中的一门重要学科,研究如何组织、存储和使用数据。...这些知识点是考研复习笔记中的一些重要内容,通过学习和掌握这些知识点,可以更好地理解和应用数据结构。

    数据结构考研复习精编

    ### 数据结构考研复习精编知识点概述 #### 一、线性表 **1.1 线性表的定义和基本操作** - **定义**:线性表是一种基本且重要的数据结构,它由一系列元素组成,这些元素按照一定的顺序排列,并且每个元素除了第一...

    江西财经大学应用统计432考研复习全书

    江西财经大学应用统计432考研复习全书 本资源是一本江西财经大学应用统计专业课复习全书,涵盖了统计学、数据分析、面试、求职等领域的知识点。下面是本 一、统计学基础知识 * 统计学概念、类型和应用 * 变异系数...

    计算机考研数据结构复习指导Word版

    这份"计算机考研数据结构复习指导Word版"提供了一条有效的学习路径,帮助考生们精准定位并攻克这个领域的关键点。 复习指导文档《复习指导(数据结构部分).doc》可能涵盖了以下内容: 1. **基本概念**:数据结构...

Global site tag (gtag.js) - Google Analytics