现在的位置: 首页 > 综合 > 正文

ZOJ 1064 (最短距离 Floyed STL)

2013年09月21日 ⁄ 综合 ⁄ 共 1790字 ⁄ 字号 评论关闭
//这题 我用到了 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;
}

抱歉!评论已关闭.