Ideal Path, NEERC 2010, UVa1599 (题解+随机测试数据)

题意简述:一张n个顶点(1~n)m条边的无向图,每条边有颜色(用整数表示),保证存在从1到n的路径。要求给出从1出发到达n的最优路径:经过的边数最少,如果存在多种这样的走法,则取其中经过边的颜色序列按字典序最小的路径。输出这一颜色序列。
原题: https://uva.onlinejudge.org/external/15/p1599.pdf
分析:m的上限为200000,用BFS求最短路径,时间复杂度为O(m)。为了先得到所有的最短路径,从节点n开始“倒序”BFS,
记录下每个节点i走到n的最短路程dis[i]。这样从1出发按每步dis减少1的路径走,必然能沿所有的最短路到达n。记录下dis以后,从节点1开始BFS。存下每一步“减1走法”中颜色最小(可能有多种)的走法(具体实现见代码中的vectornext和vectornewnext),将颜色序列存到ans数组中最后打印。
代码
//Ideal Path
//Yhq
#include
#include
#include
#include
#include
#define maxn 100005
#define maxm 200005
#define inf 1<<30
using namespace std;
int n, m;
struct edge {
	int node1, node2, color;
	edge(int n1, int n2, int n3): node1(n1), node2(n2), color(n3) {}
};
bool vis[maxn];
int dis[maxn];
vector graph[maxn], ans; //graph[i][j]=p, 则edges[p].node1==i; //ans记录最短路径颜色 
vector edges;
void reset() {
	memset(vis, false, sizeof(vis));
	memset(dis, inf, sizeof(dis));
	for (int i=0; i que;
	que.push(n);
	while (!que.empty()) {
		int last=que.front();
		que.pop();
		for (int i=0; i next;
	next.push_back(1);
	vis[1]=true;
	for (int i=1; i<=dis[1]; ++i) {
		int min_c=inf;
		for (int j=0; j newnext;
		for (int j=0; j
测试数据生成代码:

    修改数值上限MAXN, MAXM, COLOR, TESTNUM;测试数据会生成到IDEALPATH.txt文件。

#include
#include
#include
#include
#define TESTNUM 100
#define MAXN 100
#define MAXM 200
#define COLOR 10
using namespace std;
int main () {
	freopen("IDEALPATH.txt","w",stdout); 
	srand ( (unsigned int) time(NULL) );
	//code here
	int testnum=TESTNUM;
	while (testnum--) {
		int colornum=rand()%COLOR+2;
		int n=rand()%MAXN + 2;
		int m=rand()%MAXM +3;
		cout<


你可能感兴趣的:(Ideal Path, NEERC 2010, UVa1599 (题解+随机测试数据))