poj1502 - MPI Maelstrom

来源:互联网 发布:ubuntu下安装jenkins 编辑:程序博客网 时间:2024/05/17 09:23

                                    想看更多的解题报告:http://blog.csdn.net/wangjian8006/article/details/7870410
                                     转载请注明出处:
http://blog.csdn.net/wangjian8006

题意:
给你一个不完全的矩阵,数字表示权值,x表示两点间不可达
由于自身到自身花费的时间为0,所以没有给出,由于i到j和j到i距离相同,互达时间相同
所以只给出了一半的临界矩阵。
根据给你的这个临界矩阵,让你来求从点1到其他点所花费最短时间集里面的的最大值。
其实这是一个很直接的最短路

为了向熟悉下各个最短路的模板,将所有的模板都用了对比下,写了一遍最短路径

 

/*dijstraMemory 160KTime    0MS*/#include <iostream>#include <string.h>using namespace std;#define MAXV 102#define INF 100000int map[MAXV][MAXV],n;void dijstra(){int i,j,ans=-1,min,v;int d[MAXV],vis[MAXV];//d数组表示从原点到i点的最短距离//vis用于表达这个点是否已经被选中for(i=1;i<=n;i++){d[i]=INF;vis[i]=0;}d[1]=0;//因为start到start的距离为0,这里源点为1for(i=1;i<=n;i++){min=INF;for(j=1;j<=n;j++){//每次找点的过程,首先这个点没有被发现,然后找一个最小点if(!vis[j] && d[j]<min){min=d[j];v=j;}}//这里为什么找的最小的边就一定是最短路呢//因为一个图要连通起来,就必须有一条边和已知点集连起来,所以找的最小的未知点必是最短路vis[v]=1;for(j=1;j<=n;j++)//加进最小点后,再修改从源点没有被发现的点的最短路径if(!vis[j] && d[v]+map[v][j]<d[j])d[j]=d[v]+map[v][j];}for(i=2;i<=n;i++)if(d[i]>ans) ans=d[i];printf("%d\n",ans);}int main(){char s[10];int i,j;while(~scanf("%d\n",&n)){for(i=1;i<=n;i++)for(j=1;j<=n;j++)if(i!=j)map[i][j]=INF;elsemap[i][j]=0;for(i=2;i<=n;i++)for(j=1;j<i;j++){scanf("%s",s);if(s[0]!='x')map[i][j]=map[j][i]=atoi(s);//将字符串转换为数字}dijstra();}return 0;}


=============================================================

/*bellman-fordMemory 152KTime   16MS*/#include <iostream>#include <string.h>using namespace std;#define MAXE 10002#define MAXV 102#define INF 100000struct {int s,e,w;}t[MAXE];int n,m;void bellman_ford(){int i,j,ans=-1,start=1;int d[MAXV];for(i=1;i<=n;i++) d[i]=INF;d[start]=0;   for (i=1;i<n;i++){//重复进行n-1次收缩for (j=0;j<m;j++){//对每条边进行收缩if (d[t[j].s]+t[j].w<d[t[j].e])  d[t[j].e]=d[t[j].s]+t[j].w;//分别对每条边的两个顶点分别进行收缩if (d[t[j].e]+t[j].w<d[t[j].s])  d[t[j].s]=d[t[j].e]+t[j].w; }  }for(i=2;i<=n;i++)if(d[i]>ans) ans=d[i];printf("%d\n",ans);}int main(){char s[10];int i,j;while(~scanf("%d\n",&n)){m=0;for(i=2;i<=n;i++)for(j=1;j<i;j++){scanf("%s",s);if(s[0]!='x'){t[m].w=atoi(s);t[m].s=i;t[m++].e=j;}}bellman_ford();}return 0;}


 

============================================================================

 

/*spfa 邻接表Memory 208KTime   16MS*/#include <iostream>#include <queue>#include <string.h>using namespace std;#define MAXE 10002#define MAXV 102#define INF 100000struct {int s,e,w,next;}t[MAXE];int n,m,headlist[MAXV];void spfa(){int i,ans=-1,start=1,v,b;int d[MAXV],vis[MAXV];queue <int>q;for(i=1;i<=n;i++){d[i]=INF;vis[i]=0;}d[start]=0;vis[start]=1;q.push(start);while(!q.empty()){v=q.front();q.pop();vis[v]=0;for(i=headlist[v];i!=-1;i=t[i].next){b=t[i].s;if(d[v]+t[i].w<d[b]){d[b]=d[v] + t[i].w;if(!vis[b]){vis[b]=1;q.push(b);}}}}for(i=2;i<=n;i++)if(d[i]>ans) ans=d[i];printf("%d\n",ans);}int main(){char s[10];int i,j;while(~scanf("%d\n",&n)){for(i=1;i<=n;i++) headlist[i]=-1;m=0;for(i=2;i<=n;i++)for(j=1;j<i;j++){scanf("%s",s);if(s[0]!='x'){//无向图的spfa的边要存两遍t[m].w=atoi(s);t[m].s=i;t[m].e=j;t[m].next=headlist[j];headlist[j]=m++;t[m].w=atoi(s);t[m].s=j;t[m].e=i;t[m].next=headlist[i];headlist[i]=m++;}}spfa();}return 0;}


===================================================================================

 

/*spfa邻接矩阵Memory 172KTime    0MS*/#include <iostream>#include <string.h>#include <queue>using namespace std;#define MAXV 102#define INF 100000int map[MAXV][MAXV],n;void spfa(){int i,j,ans=-1,v,start=1;int d[MAXV],vis[MAXV];queue <int>q;for(i=1;i<=n;i++){d[i]=INF;vis[i]=0;}q.push(start);d[start]=0;vis[start]=1;while(!q.empty()){v=q.front();q.pop();vis[v]=0;for(i=1;i<=n;i++){if(d[i]>d[v]+map[v][i]){d[i]=d[v]+map[v][i];if(!vis[i]){q.push(i);vis[i]=1;}}}}for(i=2;i<=n;i++)if(d[i]>ans) ans=d[i];printf("%d\n",ans);}int main(){char s[10];int i,j;while(~scanf("%d\n",&n)){for(i=1;i<=n;i++)for(j=1;j<=n;j++)if(i!=j)map[i][j]=INF;elsemap[i][j]=0;for(i=2;i<=n;i++)for(j=1;j<i;j++){scanf("%s",s);if(s[0]!='x')map[i][j]=map[j][i]=atoi(s);}spfa();}return 0;}


 

 

 

 

原创粉丝点击