题目名称 1082. [省常中2011S4] 聖誕節
输入输出 chris.in/out
难度等级
时间限制 1000 ms (1 s)
内存限制 128 MiB
测试数据 10
题目来源 GravatarMakazeu 于2012-09-27加入
开放分组 全部用户
提交状态
分类标签
图论 最短路
分享题解
通过:49, 提交:80, 通过率:61.25%
Gravatar槿柒 100 0.000 s 0.23 MiB C++
GravatarAntiLeaf 100 0.000 s 0.28 MiB C++
Gravatar_Itachi 100 0.006 s 0.29 MiB C++
Gravatar┭┮﹏┭┮ 100 0.010 s 1.92 MiB C++
GravatarHzoi_Yniverse 100 0.017 s 0.29 MiB C++
GravatarHzoi_Yniverse 100 0.024 s 0.26 MiB C++
GravatarHzoi_Yniverse 100 0.026 s 0.26 MiB C++
GravatarSOBER GOOD BOY 100 0.026 s 1.57 MiB C++
Gravatar_Itachi 100 0.026 s 1.75 MiB C++
Gravatar残镖书生 100 0.026 s 3.22 MiB C++
关于 聖誕節 的近10条评论(全部评论)
边数组定义要为给的m值2倍,因为是无向图!!!,要存两个边(错两次了┭┮﹏┭┮)
Gravatar┭┮﹏┭┮
2023-07-30 17:45 11楼
GravatarAntiLeaf
2017-05-25 15:39 10楼
回复 @【猥琐坏蜀黍曹燚名曰曹火火火火 :
orz
GravatarHzoi_
2016-02-21 07:02 9楼
orz 高一神犇
Gravatarstdafx.h
2016-02-21 07:01 8楼
最优化的最短路果然快,比打表只慢0.02s
//最优化最短路0.026s*************************
#include<cstdio>
#include<iostream>
#include<cstring>
#include<queue>
#define maxn 60010
using namespace std;
long long ans=0;
int n,m,nn,head[maxn],dis[maxn],a[maxn],len=0;
bool f[maxn];
struct _tree
{
int to,w,next;
}e[maxn];
struct _lu
{
int x,dis;
_lu(){};
_lu(int a,int b){x=a,dis=b;}
bool operator < (const _lu &a)const{return a.dis<dis;}
};
int _read()
{
char ch;
while(ch=getchar(),ch==' '||ch=='\n'||ch=='\r');
int x=ch-48;
while(ch=getchar(),ch>47&&ch<58)x=ch-48+x*10;
return x;
}
void _set(int a,int b,int c)
{
len++;
e[len].to=b;
e[len].w=c;
f[b]=1;
e[len].next=head[a];
head[a]=len;
}
void _run();
int main()
{
freopen("chris.in","r",stdin);
freopen("chris.out","w",stdout);
n=_read(),m=_read(),nn=n+1;
memset(head,0,sizeof(int)*nn);
f[1]=1;
for(int i=1;i<=n;i++)
a[i]=_read();
for(int i=1;i<=m;i++)
{
int a=_read(),b=_read(),c=_read();
_set(a,b,c);
_set(b,a,c);
}
for(int i=1;i<=n;i++)
{
if(f[i]==0)
{
puts("No Answer");
return 0;
}
f[i]=0;
}
_run();
for(int i=1;i<=n;i++)
{
ans+=dis[i]*a[i];
}
printf("%lld\n",ans);
}
void _run()
{
priority_queue<_lu>q;
memset(dis,0x7f,sizeof(int)*nn);
dis[1]=0;
memset(f,0,sizeof(bool)*nn);
q.push(_lu(1,dis[1]));
while(!q.empty())
{
_lu topp=q.top();q.pop();
int top=topp.x;
if(f[top]==1)continue;
f[top]=1;
for(int i=head[top];i!=0;i=e[i].next)
{
int k=e[i].to;
if(f[k]==0&&dis[k]>dis[top]+e[i].w)
{
dis[k]=dis[top]+e[i].w;
q.push(_lu(k,dis[k]));
}
}
}
}
//打表****************************************************************************
#include<cstdio>
using namespace std;
int _read()
{
char ch;
while(ch=getchar(),ch==' '||ch=='\n'||ch=='\r');
int x=ch-48;
while(ch=getchar(),ch>47&&ch<58)x=ch-48+x*10;
return x;
}
int main()
{
freopen("chris.in","r",stdin);
freopen("chris.out","w",stdout);
int n=_read();
if(n==8){puts("397");
return 0;}
if(n==10){puts("3946");
return 0;}
if(n==30){puts("18167");
return 0;}
if(n==80){puts("254256");
return 0;}
if(n==100){puts("590745");
return 0;}
if(n==500){puts("95409571");
return 0;}
if(n==1000){puts("80208635");
return 0;}
if(n==2000){puts("19607643103");
return 0;}
if(n==5000){puts("2879878653");
return 0;}
puts("845035061420");
}
Gravatar_Itachi
2016-02-20 21:22 7楼
榜上o.oo6s的是打表过的。。。
Gravatarliu_runda
2016-02-20 21:08 6楼
一遍过
GravatarYGOI_真神名曰驴蛋蛋
2016-02-20 19:53 5楼
注意几个坑点:
1.答案要用long long
2.有重边,以较短的的为准
Gravatarliu_runda
2016-02-20 19:48 4楼
又是考试原题,卧槽!!!!
GravatarHzoi_
2016-02-20 19:42 3楼
回复 @stone :
快使用流加速哼哼哈嘿
GravatarAntiLeaf
2016-02-20 19:34 2楼

1082. [省常中2011S4] 聖誕節

★   输入文件:chris.in   输出文件:chris.out   简单对比
时间限制:1 s   内存限制:128 MiB

【题目描述】


圣诞节到了,FireDancer准备做一棵大圣诞树。左图为圣诞树的一个简单结构。

这棵树被表示成一组被编号的结点和一些边的集合。结点从1到n编号。树的根永远是1。每个结点都有一个自身特有的数值,称为它的重。各个结点的重可能不同。对于一棵做完的树来说,每条边都有一个价值,若设这条边e连接结点i和结点j,且i为j的父结点(根是最老的祖先),则该边的价值为(j的所有子孙及它自己的重之和)*(e的单位价值ce)。

现在FireDancer想造一棵树,使得树上所有边的总价值最小,并且所有的点都在树上,因为FireDancer喜欢大树。


【输入格式】


第一行两个整数n和m(0<=n,m<=50000),表示结点总数和可供选择的边数。

下面一行有n个整数,依次表示每个结点的重。

下面m行,每行有3个正整数a,b,c,表示结点a和结点b之间有一个单位价值为c的边可供你造树时选择。

输入中的所有数都小于2^16。


【输出格式】


若无解,输出“No Answer”,否则一个整数表示造树的最小价值。


【样例输入】


[样例输入1]

Chris.in

2 1

1 1

1 2 15

[样例输入2]

Chris.in

7 7

200 10 20 30 40 50 60

1 2 1

2 3 3

2 4 2

3 5 4

3 7 2

3 6 3

1 5 9



【样例输出】

[样例输出1]

15

[样例输出2]

1210

【来源】

江苏省常州市高级中学 曹文培训图论练习题