您的位置:首页 > 理论基础 > 数据结构算法

ZOJ 1064 (最短距离 Floyed STL)

2012-08-14 18:59 337 查看
//这题 我用到了 map和queue的数据结构,Floyed算法。根据题目要求  需要先用优先队列把输出的内容排序  ,后来wa了几次,发现这个小数点的约分也要注意的,一个我根据以前经验根据double保存的不精确性转换成int,另一个是四舍五入得加上0.5的问题,最后就是要看清题意,才开始我认为输出的条件是考虑从牌子处开始记录到目标的里程数和前一个城市开始记录的大小关系,后来发现没有必要挖去之前的距离,即距离都是从先前城市开始记起,这是从现实出发我们也能想到的。啰嗦了一堆,附上代码
#include<stdio.h>
#include<iostream>
#include<queue>
#include<map>
using namespace std;
map<int,string>M;
struct Node{
int x;
string name;
friend bool operator<(Node a,Node b){
if(a.x!=b.x) return a.x>b.x;
else return a.name>b.name;
}
};
priority_queue<Node>Q;
map<int,string>::iterator it;
const int INF = 1000000000;
const int maxn = 31;
void floyd(int n,int map[][maxn],int dist[][maxn],int pre[][maxn])
{
int i,j,k;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
dist[i][j]=map[i][j];
pre[i][j]=i;
}
}
for(k=0;k<n;k++)
for(i=0;i<n;i++)
for(j=0;j<n;j++)
if(dist[i][k]!=INF&&dist[k][j]!=INF&&dist[i][j]>dist[i][k]+dist[k][j]){
dist[i][j]=dist[i][k]+dist[k][j];
pre[i][j]=pre[k][j];
dist[j][i]=dist[j][k]+dist[k][i];
pre[j][i]=pre[k][i];
}
}

int main()
{
int n,m,k,s;
int x,y;
int t;
Node p;
double tmp;
char name[20];
int map[maxn][maxn];
int dist[maxn][maxn];
int pre[maxn][maxn];
scanf("%d",&t);
while(t--)
{
scanf("%d%d%d",&n,&m,&k);
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
{
if(i==j) map[i][j]=0;
else map[i][j]=INF;
}
while(m--)
{
scanf("%d%d%lf",&x,&y,&tmp);
map[x][y]=(int)(tmp*100+0.01);
map[y][x]=(int)(tmp*100+0.01);
}
floyd(n,map,dist,pre);
while(k--)
{
scanf("%d %s",&x,name);
M[x]=name;
}
scanf("%d",&s);
while(s--)
{
scanf("%d%d%lf",&x,&y,&tmp);
for(int i=0;i<n;i++)
{
if(dist[y][i]!=INF&&i!=x){
if(dist[x][i]!=INF){
if(dist[x][i]<dist[y][i]+dist[x][y]) continue;
}
it=M.find(i);
if(it!=M.end()){
p.x=(dist[y][i]+50+dist[x][y]-(int)(tmp*100+0.01))/100;
p.name=it->second;
Q.push(p);
}
}
}
while(!Q.empty())
{
Node front =Q.top();
cout<<front.name;
for(int j=0;j<20-front.name.length();j++)
cout<<" ";
cout<<front.x<<endl;
Q.pop();
}
if(s) printf("\n");
}
M.clear();
if(t) printf("\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息