1.问题
1.1 POJ 1062
建立有向图:比如,物品1能被替代品2所替代,且所需金币为200;则存在一条从点2到点1的边,且边长为200。
等级处理采用的是枚举。用rank[ ]表示每一节点的等级,节点0表示探险家,节点1表示国王。用M表示等级的限制,那么探险家可以交易的区间为[rank(1)-M, rank(1)] ,… ,[rank(1), rank(1)+M]。注:[ ]表示闭区间,rank(1)表示国王的等级。
最后一次WA,没有考虑极端情况:输入的N为100。将#define MAX 100改为#define MAX 101,就AC了。
源代码:
1062 |
Accepted |
204K |
32MS |
C |
1823B |
2013-08-09 21:05:13 |
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#define MAX 101
#define inf 0xffffff
int edge[MAX][MAX];
int rank[MAX],trade[MAX];
void init(int N)
{
int i,j,k,X;
for(i=0;i<=N;i++)
{
for(j=0;j<i;j++)
{
edge[i][j]=edge[j][i]=inf;
}
edge[i][i]=0;
}
for(i=1;i<=N;i++)
{
scanf("%d%d%d",&edge[0][i],&rank[i],&X);
for(j=0;j<X;j++)
{
scanf("%d",&k);
scanf("%d",&edge[k][i]);
}
}
}
int smaller(int be,int af)
{
return be<=af?be:af;
}
int dijkstra(int N)
{
int i,count=1,temp,min_lowcost,min_node;
int *lowcost=(int *) malloc((N+1)*sizeof(int));
int *visit=(int *) malloc((N+1)*sizeof(int));
for(i=0;i<=N;i++)
{
lowcost[i]=(i==0?0:inf);
visit[i]=(i==0?1:0);
}
min_node=0;
while(count<=N)
{
min_lowcost=inf;
for(i=1;i<=N;i++)
{
if(trade[i]&&!visit[i]&&edge[min_node][i]!=inf)
lowcost[i]=smaller(lowcost[i],lowcost[min_node]+edge[min_node][i]);
}
for(i=1;i<=N;i++)
if(trade[i]&&!visit[i]&&lowcost[i]<min_lowcost)
{
min_lowcost=lowcost[i];
min_node=i;
}
visit[min_node]=1;
count++;
}
temp=lowcost[1];
free(lowcost);
free(visit);
return temp;
}
int main()
{
int i,j,rank_limit,N,min_god=inf;
while(scanf("%d%d",&rank_limit,&N)!=EOF)
{
init(N);
for(i=0;i<=rank_limit;i++)
{
memset(trade,0,(N+1)*sizeof(int));
trade[0]=trade[1]=1;
for(j=2;j<=N;j++)
{
if(rank[j]>=rank[1]-rank_limit+i&&rank[j]<=rank[1]+i)
trade[j]=1;
}
min_god=smaller(min_god,dijkstra(N));
}
printf("%d\n",min_god);
}
return 0;
}
1.2 POJ 1797
该问题可用(n,m)图来描述:crossings是图的顶点,streets是图的边;源点是标号为1的顶点,汇点是标号为n的顶点。源点到汇点的每一通路均有一条最短边,在这些最短边中找出最大值,此最大值即为the
maximum allowed weight。
同样地,修改松弛条件:dis[i]=max{min{dis[j],edge[j][i]},dis[i]}
其中,dis[i]记录源点到点i所有通路的最短边。
用memset( )初始化动态数组时,在指定大小时不能直接sizeof(数组名)。如:memset(dis,0,sizeof(dis))就是错误的,并不能将动态数组全部置0。
源代码:
1797 |
Accepted |
4080K |
485MS |
C |
1338B |
2013-08-11 18:30:42 |
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#define MAX 1000
#define inf 0xffffff
int edge[MAX][MAX];
void init(int n,int m)
{
int i,start,end;
memset(edge,0,sizeof(edge));
for(i=0;i<m;i++)
{
scanf("%d%d",&start,&end);
scanf("%d",&edge[start-1][end-1]);
edge[end-1][start-1]=edge[start-1][end-1];
}
}
int smaller(int be,int af)
{
return be<=af?be:af;
}
int larger(int be,int af)
{
return be>=af?be:af;
}
void dijkstra(int n)
{
int i,count=1,max_node,max_dis;
int *dis=(int *) malloc(n*sizeof(int));
int *visit=(int *) malloc(n*sizeof(int));
memset(dis,0,n*sizeof(int));
memset(visit,0,n*sizeof(int));
dis[0]=inf;
visit[0]=1;
max_node=0;
while(count<n)
{
max_dis=0;
for(i=1;i<n;i++)
{
if(!visit[i]&&edge[max_node][i]!=0)
dis[i]=larger(smaller(dis[max_node],edge[max_node][i]),dis[i]);
}
for(i=1;i<n;i++)
{
if(!visit[i]&&dis[i]>max_dis)
{
max_dis=dis[i];
max_node=i;
}
}
visit[max_node]=1;
count++;
}
printf("%d\n\n",dis[n-1]);
free(dis);
free(visit);
}
int main()
{
int test_case,i,n,m;
scanf("%d",&test_case);
for(i=0;i<test_case;i++)
{
scanf("%d%d",&n,&m);
init(n,m);
printf("Scenario #%d:\n",i+1);
dijkstra(n);
}
return 0;
}
1.3 POJ 3268
题目大意:每一个农场都有一只cow,cow们要去农场X参加party,当party结束后返回自己的农场。cow非常懒,去程与返程都选择最短路径。求:在所有的cow中,去程+返程花费最多的时间是多少?
思路:将农场X看作源点,其他的农场均看作汇点,去程的最短路径用Dijkstra即可求的。然后将图的邻接矩阵转置,再次用Dijkstra,并还将农场X看作源点,其余点是汇点(参考Discuss)。
源代码:
3268 |
Accepted |
4076K |
94MS |
C |
1779B |
2013-08-11 22:09:40 |
#include "stdio.h"
#include "stdlib.h"
#define MAX 1000
#define inf 0xffffff
int edge[MAX][MAX];
void init(int N,int M)
{
int i,j,start,end;
/*initialize the edge*/
for(i=0;i<N;i++)
{
for(j=0;j<i;j++)
edge[i][j]=edge[j][i]=inf;
edge[i][i]=0;
}
for(i=0;i<M;i++)
{
scanf("%d%d",&start,&end);
scanf("%d",&edge[start-1][end-1]);
}
}
int larger(int be,int af)
{
return be>=af?be:af;
}
int smaller(int be,int af)
{
return be<=af?be:af;
}
void dijkstra(int N,int X,int lowcost[])
{
int i,count=1,min_lowcost,min_node;
int *visit=(int *) malloc(N*sizeof(int));
for(i=0;i<N;i++)
{
lowcost[i]=inf;
visit[i]=0;
}
/*set the source node as X*/
lowcost[X-1]=0;
visit[X-1]=1;
min_node=X-1;
while(count<N)
{
min_lowcost=inf;
for(i=0;i<N;i++)
{
if(!visit[i]&&edge[min_node][i]!=inf)
lowcost[i]=smaller(lowcost[i],lowcost[min_node]+edge[min_node][i]);
}
for(i=0;i<N;i++)
if(!visit[i]&&lowcost[i]<min_lowcost)
{
min_lowcost=lowcost[i];
min_node=i;
}
visit[min_node]=1;
count++;
}
free(visit);
}
void transpose(int N)
{
int i,j,temp;
for(i=0;i<N;i++)
for(j=0;j<i;j++)
{
temp=edge[i][j];
edge[i][j]=edge[j][i];
edge[j][i]=temp;
}
}
int main()
{
int i,N,M,X,longest=0;
int to[MAX],back[MAX];
scanf("%d%d%d",&N,&M,&X);
init(N,M);
dijkstra(N,X,to);
transpose(N);
dijkstra(N,X,back);
/*find the longest trip*/
for(i=0;i<N;i++)
longest=larger(longest,to[i]+back[i]);
printf("%d\n",longest);
return 0;
}
分享到:
相关推荐
最短路径算法dijkstra的matlab实现
最短路径算法Dijkstra源代码,测试可以正常使用
java算法分析与设计之单源最短路径(Dijkstra算法)源代码 算法作为计算机专业学生的必修课,同时也是软件开发过程中必备的编程思想,对学习研究计算机专业意义重大;正因为这门课程难,所以除了相关方面的书籍,网络...
Dijkstra算法求最短路径的C/C++程序
最短路径分析Dijkstra算法的优化实现,徐辛超,,最短路径问题是地理信息系统的关键问题,传统Dijkstra算法在求解节点间最短路径时,对已标识节点以外的大量节点进行了计算,从而影�
并行最短路径算法Dijkstra。 为实现并行最短路径计算,我们必须要解决如下问题: (1)数据获取:利用随机函数生成大约2000个节点及其节点之间的距离。本程序使用邻接矩阵来存储带权有向图的信息。矩阵大小2000*2000...
详细讲述如何实现最短路径,及c#的代码实现
最短路径-Dijkstra算法 从指定起始点向任一点搜索基于一定权重的最短路径。
最短路径算法dijkstra的matlab程序。
利用Matlab编写的求解最短路径的Dijkstra算法,测试通过
该程序是我写的博客“一起talk C栗子吧(第五十四回:C语言实例--图的最短路径二)”的配套程序,共享给大家使用
dijkstra第k条最短路径算法 Dijkstra(迪杰斯特拉)算法是典型的最短路径路由算法,用于计算一个节点到其他所有节点的最短路径。
本设计以VC++6.0作为程序开发环境,C语言作为程序开发语言,详细介绍了最短路径的求解算法及其C语言实现过程。系统主要实现了图的创建、单源点最短路径的计算功能。依照本系统可以解决实际生活中许多路径选择问题,...
Dijkstra最短路径算法的Matlab实现 包括最短路径的打印子程序
毕业设计:最短路径算法实现,Dijkstra算法,双向Dijkstra算法,CH算法,SILC算法 毕业设计:最短路径算法实现,Dijkstra算法,双向Dijkstra算法,CH算法,SILC算法 毕业设计:最短路径算法实现,Dijkstra算法,双向...
C# 最短路径:Dijkstra算法,参考java代码写的,重要的是理解算法思想
Dijkstra算法找最短路径代码,包括43个案例分析
针对用于网络寻径表刷新的0sPF路由选择协议中使用的计算最短路径树的Diikstra算法在网络应用中的不足.提出了一种改进算法,用以计算边和节点上都有代价的图的最短路径树,以更全面刻画网络状态,找到更合理的最短...
最短路径用Dijkstra算法实现的MFC编程 ,用画笔将点连接起来
基于MFC的校园导航程序(使用最短路径dijkstra算法).rar 基于MFC的一个程序,一个简易的地大导航程序,使用的算法是图的最短路径dijkstra算法 基于MFC的一个程序,一个简易的地大导航程序,使用的算法是图的最短...