浙大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];
}
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];
}
相关文章推荐
- 浙大PAT甲级-1030
- 浙大PAT甲级 1052
- 浙大PAT甲级 1063
- *浙大PAT甲级 1067
- **PAT浙大甲级 1095
- 浙大PAT甲级-1003
- 浙大PAT甲级1019. General Palindromic Number (20)
- 浙大pat | 浙大pat 牛客网甲级 1098. Insertion or Heap Sort (25)判断是哪种排序方式
- 浙大pat | 牛客网甲级 1025 Sort with Swap(0) (25)排序
- 浙大PAT甲级 1031
- 浙大PAT甲级 1040
- ** 浙大PAT甲级 1068 01背包问题
- 浙大PAT甲级 1080
- 浙大PAT甲级 1102
- 浙大PAT甲级-1015
- 浙大PAT甲级-1029
- 浙大pat | 浙大pat 牛客网甲级 1010 Build A Binary Search Tree (30) 二叉搜索树
- 浙大pat | 牛客网甲级 1037Find Coins (25) 数组循环遍历
- 浙大PAT甲级 1032
- 浙大PAT甲级 1038