题目名称 | 1082. [省常中2011S4] 聖誕節 |
---|---|
输入输出 | chris.in/out |
难度等级 | ★ |
时间限制 | 1000 ms (1 s) |
内存限制 | 128 MiB |
测试数据 | 10 |
题目来源 | Makazeu 于2012-09-27加入 |
开放分组 | 全部用户 |
提交状态 | |
分类标签 | |
分享题解 |
通过:49, 提交:80, 通过率:61.25% | ||||
槿柒 | 100 | 0.000 s | 0.23 MiB | C++ |
AntiLeaf | 100 | 0.000 s | 0.28 MiB | C++ |
_Itachi | 100 | 0.006 s | 0.29 MiB | C++ |
┭┮﹏┭┮ | 100 | 0.010 s | 1.92 MiB | C++ |
Hzoi_Yniverse | 100 | 0.017 s | 0.29 MiB | C++ |
Hzoi_Yniverse | 100 | 0.024 s | 0.26 MiB | C++ |
Hzoi_Yniverse | 100 | 0.026 s | 0.26 MiB | C++ |
SOBER GOOD BOY | 100 | 0.026 s | 1.57 MiB | C++ |
_Itachi | 100 | 0.026 s | 1.75 MiB | C++ |
残镖书生 | 100 | 0.026 s | 3.22 MiB | C++ |
关于 聖誕節 的近10条评论(全部评论) | ||||
---|---|---|---|---|
边数组定义要为给的m值2倍,因为是无向图!!!,要存两个边(错两次了┭┮﹏┭┮)
| ||||
| ||||
回复 @【猥琐坏蜀黍曹燚名曰曹火火火火 :
orz | ||||
orz 高一神犇
stdafx.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"); } | ||||
榜上o.oo6s的是打表过的。。。
| ||||
一遍过
| ||||
注意几个坑点:
1.答案要用long long 2.有重边,以较短的的为准 | ||||
又是考试原题,卧槽!!!!
| ||||
回复 @stone :
快使用流加速哼哼哈嘿 |
圣诞节到了,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
江苏省常州市高级中学 曹文培训图论练习题