旅行
A君所在的城市可以抽象成为个有n(1 ≤n ≤ 20000)个点和m(1 ≤ m ≤ 50000)条无向边的地图。
A君住在1号点,他想进行一次环城市旅游。他从1号点出发,每次沿着和1号点相连的边中最短的边到下一个城市(如果有很多个最短的边,选择编号最小的走),到达下一个城市以后,还是沿着和这个城市相连的最短边走到下一个点(如果有很多个最短的边,选择编号最小的走),一直这样走下去,直到要走到一个已经走过的,就结束这次旅行。
输入格式:
输入第一行两个整数n, m.
接下来m行,每行输入三个整数u,(1 ≤ u,u≤ n,u≠u),
w(1 ≤ w ≤ 10^5).表示有一条连接u和u长度为w的无向边。
输出格式:
输出一行若干个整数,依次表示蒜头君旅行经过的点,每两个数中间用一个空格隔开。
输入样例:
4 4
3 4 4
4 2 5
2 1 7
4 1 5
输出样例:
1 4 3
一道简单的图的题目。点的数量很多用邻接矩阵可能是不行的,所以要用邻接表存储图
#include<cstdio>
#include<vector>
using namespace std;
const int maxn=100000000;
struct edge
{
int v,w;
};
int flag[20000];
vector<edge> G[20000];
void insert1(int u,int v,int w)
{
edge e;
e.v=v;
e.w=w;
G[u].push_back(e);
}
void insert2(int u,int v,int w)//插入无向边
{
insert1(u,v,w);
insert1(v,u,w);
}
int main()
{
int n,m,u,v,w;
scanf("%d%d",&n,&m);
for(int i=0;i<m;i++)//建立图
{
scanf("%d%d%d",&u,&v,&w);
insert2(u,v,w);
}
int now=1;
while(!flag[now])//当某个地点被标记过后退出循环
{
int minw=maxn,minv=maxn,x;
for(int i=0;i<G[now].size();i++)//寻找某个顶点出发的最短的一条路径
{
if(G[now][i].w<minw)//找最短的路径
{
minw=G[now][i].w;
minv=G[now][i].v;
x=G[now][i].v;
}
else if(G[now][i].w==minw&&G[now][i].v<minv)//如果距离一样找编号小的
{
minv=G[now][i].v;
x=G[now][i].v;
}
}
flag[now]=1;
printf("%d ",now);
now=x;
}
return 0;
}