6 November in 614
阿新 • • 發佈:2018-11-06
Contest
A. greet
map
,完了。
B. gift
map
,完了。
C. [Usaco2008 Nov Gold] 安慰奶牛
最小生成樹。新邊權設為原邊權的兩倍,再加上兩端點的點權。完了……
前三題真是增添我的自信心!(一遍過!當然前三題我都寫過原題了……真實水平體現不出來。)
D. [NOIP2009TG] 最優貿易
SPFA 雙向廣搜。(還沒搞明白,之後再更)
貼一發 90 分卡時限程式碼(說不定再亂搞一下就滿分了……):
#include <cstdio> int n, m, p[100005]; int head[100005], nex[1000006], to[1000006]; int dp[100005], v[100005]; inline int read() { int res=0; char ch=getchar(); while (ch<'0'||ch>'9') ch=getchar(); while (ch>='0'&&ch<='9') res=res*10+ch-'0', ch=getchar(); return res; } inline int min(int x, int y) {return x>y?y:x; } inline int max(int x, int y) {return x>y?x:y; } inline void add(int x, int y) { nex[++head[0]]=head[x], head[x]=head[0], to[head[0]]=y; } void dfs(int x, int fa, int mi) { int flag=1; mi=min(mi, p[x]); if (v[x]!=mi) v[x]=mi, flag=0; int s=max(dp[fa], p[x]-mi); if (dp[x]<s) dp[x]=s, flag=0; if (flag) return; for (register int i=head[x]; i; i=nex[i]) dfs(to[i], x, mi); } int main() { n=read(), m=read(); for (register int i=1; i<=n; ++i) p[i]=read(); for (register int i=1, x, y, z; i<=m; ++i) { scanf("%d%d%d", &x, &y, &z); add(x, y); if (z>1) add(y, x); } dfs(1, 0, 0x3f3f3f3f); printf("%d\n", dp[n]); return 0; }