您的位置:首页 > 其它

浙大PAT甲级 1030

2016-08-20 14:33 288 查看
单源最短路径,可用dijkstra算法,只不过需要多设置一个数组minn[505]来表示从源点开始到达该点的最短费用。

AC代码:

#include<iostream>
#include<vector>
#include<map>
#include<cstdio>
#include<algorithm>
#include<queue>
#define inf 10000000
using namespace std;
struct node
{
int dis;
int cost=inf;
};
node a[505][505];
int minn[505];
int path[505];
int dist[505];
int mark[505];
int main()
{
int n,m,start,endd;
cin>>n>>m>>start>>endd;
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
if(i==j) a[i][j].dis=0;
else
a[i][j].dis=inf;
}
}
for(int i=0;i<m;i++)
{
int b,c,d,e;
cin>>b>>c>>d>>e;
a[b][c].dis=a[c][b].dis=d;
a[b][c].cost=a[c][b].cost=e;
}
for(int i=0;i<n;i++)
{
dist[i]=a[start][i].dis;
if(dist[i]!=inf&&i!=start) path[i]=start;
else
path[i]=-1;
minn[i]=a[start][i].cost;
}
mark[start]=1;
for(int i=0;i<n-1;i++)
{
int xiao=inf;
int biaoji;
for(int j=0;j<n;j++)
{
if(mark[j]==0&&dist[j]<xiao)
{
xiao=dist[j];
biaoji=j;
}
}
mark[biaoji]=1;
for(int j=0;j<n;j++)
{
if(mark[j]==0)
{
if(dist[biaoji]+a[biaoji][j].dis<dist[j])
{
dist[j]=dist[biaoji]+a[biaoji][j].dis;
minn[j]=minn[biaoji]+a[biaoji][j].cost;
path[j]=biaoji;
}
else if(dist[biaoji]+a[biaoji][j].dis==dist[j])
{
if(minn[biaoji]+a[biaoji][j].cost<minn[j])
{
minn[j]=minn[biaoji]+a[biaoji][j].cost;
path[j]=biaoji;
}
}
}

}
}
int lu[505];
lu[0]=endd;
int num=1;
int tmp=endd;
while(path[tmp]!=start)
{
lu[num++]=path[tmp];
tmp=path[tmp];
}
cout<<start;
for(int i=num-1;i>=0;i--)
{
cout<<" "<<lu[i];
}
cout<<" "<<dist[endd]<<" "<<minn[endd];

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: