洛谷 U80415 懒懒的Seaway
洛谷 U80415 懒懒的Seaway
题目背景
经过不懈的努力,FSW终于溜出了机房,找到了他的女朋友...他们一起去了儿童公园...但是问题又来了!儿童公园有很多好玩的景点,而且路线极其的复杂!!最可怕的是,FSW和她的女朋友都是大路痴qwq。所以,需要你来帮忙...
题目描述
FSW怀着忐忑的心情打开了儿童公园的地图,他发现儿童公园一共有N个景点,有M条链接不同景点的路。最让FSW惊奇的是,地图上还贴心地标出了每个景点的“趣味值”W_i和每条路的长度D_i。这令FSW窃喜,因为他懒得要命,根本不想在这个幼儿公园里浪费太多的时间,他准备直接去玩趣味值最大的景点,然后直接带着女朋友离开。现在,他请你帮忙找出,从公园大门(定义为景点1)到趣味值最大的景点再回到大门时,FSW和他的女朋友需要走的最短的路径长度。当然,如果无法到达趣味值最大的景点,FSW会去趣味值稍小一点的景点...数据保证FSW一定会有可以去的景点。
输入格式
第一行包括两个整数N,M。 接下来的1行,共N个数,代表N个景点的趣味值W_i,输入保证大门的趣味值为0。 接下来的M行,每行3个数u,v,d,代表点u,v之间有一条距离为d的路。
输出格式
输出包括2行。 第一行一个整数S代表FSW带着女朋友去到的景点编号。 第二行一个整数P代表FSW和女朋友一共走的距离。
输入输出样例
输入 #1复制
输出 #1复制
说明/提示
数据范围: 2<=N<=200 1<=M<=4000 0<=W_i,D_i<=1000
这也是自己出的题,算是T2吧吼吼吼。
一道图论的题,再难了我就不会了。
出数据点很困难,但保证数据特别卡人。
唯一加入的坑点可以算是结构体排序,其他的没什么太难的。
直接上代码吧:
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
using namespace std;
int n,m;
int tot,to[8002],val[8002],nxt[8002],head[201];
int dist[201],v[201];
struct node
{
int id,d;
}a[201];
void add(int x,int y,int z)
{
to[++tot]=y;
val[tot]=z;
nxt[tot]=head[x];
head[x]=tot;
}
bool cmp(node a,node b)
{
return a.d>b.d;
}
void spfa()
{
memset(dist,0x3f,sizeof(dist));
memset(v,0,sizeof(v));
queue<int> q;
q.push(1);
v[1]=1;
dist[1]=0;
while(!q.empty())
{
int x=q.front();
q.pop();
v[x]=0;
for(int i=head[x];i;i=nxt[i])
{
int y=to[i];
if(dist[y]>dist[x]+val[i])
{
dist[y]=dist[x]+val[i];
if(v[y]==0)
q.push(y),v[y]=1;
}
}
}
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i].d);
a[i].id=i;
}
sort(a+1,a+n+1,cmp);
for(int i=1;i<=m;i++)
{
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
add(x,y,z);
add(y,x,z);
}
spfa();
for(int i=1;i<=n;i++)
{
int aid=a[i].id;
if(dist[aid]<1e9)
{
printf("%d\n%d",aid,dist[aid]*2);
return 0;
}
}
}