您的位置:首页 > 其它

PKU 1847 最短路径 djistrla

2011-06-02 22:50 295 查看
已经很久没做程序题了,也已经很久没有接触c,c++。这些东西已经忘的差不多了,但为了不让自己彻底忘记掉这些宝贵的知识。今天把上大学时写的一个最短路模版翻出来看下来。我草,这代码确实够烂的,没有注释,完全的面向过程编程,复用性就更不用说了。找了一个pku的最短路径题目试了下模版的正确性,不错,一次AC通过。贴出自己那丑陋的代码,后续再对这个代码动手术。

#include<iostream>
#include <stdlib.h>
#define INFINITY 30000
#define LENGTH 102
using namespace std;
struct {
int dist[LENGTH][LENGTH];
} map;
int main()
{
int m,i,j,a,b,cc,dc,le,num,v,v0,min,n;
int dist[105][105],d[105];
int p[105][105],final[105];
while(cin>>m)
{
cin>>a>>b;
for(i=1;i<=m;i++)
for(j=1;j<=m;j++) {dist[i][j]=INFINITY;dist[j][i]=INFINITY;}
for(i=1;i<=m;i++)
{
cin>>n;
for(j=1;j <=n;j++){
cin>>cc;
if(j==1){
dist[i][cc] = 0;
}else{
dist[i][cc] = 1;
}
}
}
v0=a;
//初始化
for(i=1;i<=m;i++)
{
final[i]=false;d[i]=dist[v0][i];
}
d[v0]=0;final[v0]=true;
for(i=1;i<m;i++)
{
min=INFINITY;
for(j=1;j<=m;j++)
if(!final[j])
if(d[j]<min) {v=j;min=d[j];}
if(min != INFINITY){
final[v]=true;
for(j=1;j<=m;j++)
if(!final[j]&&(min+dist[v][j]<d[j]))
{
d[j]=min+dist[v][j];
}
}
}
if(d[b] == INFINITY){
cout<<"-1"<<endl;
}else {
cout<<d[b]<<endl;
}
}
return 0;
}


本想着趁着自己心想不错,再看看其它算法,可是今天有点累了,休息下。找一个自己喜欢的娱乐方式放松下,自己平时不喜欢打网游。空时玩玩小游戏,最近发一个新的小游戏网站做的不错,广告几乎没有,http://www.7k76.com/ ,mark一下,下次闲的时候可以玩玩。

今天把上周写的代码,重先改了下,用了c中的结构体,让程序更好维护。重用性更强。

#include<iostream>
#include <stdlib.h>
#define INFINITY 30000
#define LENGTH 102
using namespace std;
struct Graip{
int i,j;
int dist[LENGTH][LENGTH];
int s[LENGTH];
int d[LENGTH];
int edgeNum;
//起始点
int v0;
//初始化
void reset(){
for(i=0;i<=edgeNum;i++)
for(j=0;j<=edgeNum;j++) {dist[i][j]=INFINITY;dist[j][i]=INFINITY;}
};

//最短路径
void dijkstra(){
for(i=0;i<=edgeNum;i++)
{
s[i]=false;d[i]=dist[v0][i];
}
int min,v;
d[v0]=0;s[v0]=true;
for(i=1;i<edgeNum;i++)
{
min=INFINITY;
for(j=1;j<=edgeNum;j++)
if(!s[j])
if(d[j]<min) {v=j;min=d[j];}
if(min != INFINITY){
s[v]=true;
for(j=1;j<=edgeNum;j++)
if(!s[j]&&(min+dist[v][j]<d[j]))
{
d[j]=min+dist[v][j];
}
}
}
}
} map;
int main()
{
int i,j,m,a,b,cc,n;
while(cin>>m)
{
cin>>a>>b;
map.edgeNum = m;
map.v0=a;
map.reset();
for(i=1;i<=m;i++)
{
cin>>n;
for(j=1;j <=n;j++){
cin>>cc;
if(j==1){
map.dist[i][cc] = 0;
}else{
map.dist[i][cc] = 1;
}
}
}

map.dijkstra();
if(map.d[b] == INFINITY){
cout<<"-1"<<endl;
}else {
cout<<map.d[b]<<endl;
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: