您的位置:首页 > 产品设计 > UI/UE

poj1122 FDNY to the Rescue! 最短路

2012-10-29 17:09 274 查看
这道题是最短路问题,开始卡了好久后来才发现是因为i,j坐标输入有问题。我更改了i,j坐标顺序才发现正确结果,坑啊!

不过别的就是个裸地最短路了。

#include <iostream>
#include <stdio.h>
#include <cstring>
#include <algorithm>
#define INF 100000000
#define maxn 25
using namespace std;
int n;
int edge[maxn][maxn];
int dist[maxn];
int s[maxn];
int path[maxn];
struct point
{
int num,len;
}points[maxn];
bool cmp(point a,point b)
{
return a.len<b.len;
}
void dijkstra(int v0)
{
int i,j,k;
for(i=0;i<n;++i)
{
dist[i]=edge[v0][i];    s[i]=0;
if(i!=v0&&dist[i]<INF)    path[i]=v0;
else path[i]=1;
}
s[v0]=1;    dist[v0]=0;
for(i=0;i<n-1;++i)
{
int min=INF,u=v0;
for(j=0;j<n;++j)
{
if(!s[j]&&dist[j]<min)
{
u=j;    min=dist[j];
}
}
s[u]=1;
for(k=0;k<n;++k)
{
if(!s[k]&&edge[u][k]<INF&&dist[u]+edge[u][k]<dist[k])
{
dist[k]=dist[u]+edge[u][k];    path[k]=u;
}
}
}
}
int main()
{
int i,j;
cin>>n;
for(i=0;i<n;++i)
for(j=0;j<n;++j)
{
cin>>edge[j][i];
if(edge[j][i]==-1) edge[j][i]=INF;
}
int begin,temp,count=0;
cin>>begin;
begin--;
dijkstra(begin);
while(cin>>temp)
{
if(temp==-2) break;
points[count++].num=temp-1;
}
for(i=0;i<count;++i)
points[i].len=dist[points[i].num];
sort(points,points+count,cmp);
int shortest[maxn];
cout<<"Org\tDest\tTime\tPath"<<endl;
for(i=0;i<count;++i)
{
cout<<points[i].num+1<<"\t"<<begin+1<<"\t"<<points[i].len;
memset(shortest,0,sizeof(shortest));
int k=0;
shortest[k]=points[i].num;

while(path[shortest[k]]!=begin)
{
++k;shortest[k]=path[shortest[k-1]];
}
k++;    shortest[k]=begin;
if(shortest[k]==shortest[0]) cout<<"\t"<<shortest[k]+1;
else
for(j=0;j<=k;j++)
cout<<"\t"<<shortest[j]+1;
cout<<endl;
}

return 0;

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