題目大意:給個無向圖,每條邊有個限制,每個點最多能**和賣出一定**;然後按順序走過n個點,求每個賣出**的點最多能賣出多少**
一開始有點懵,想著怎麼再圖上做這個問題,後來知道要先建一棵最大生成樹
然後就好做了,做的時候**全都拿,不必考慮第乙個條件,因為就算花不完也能在之前某個地方少買一點**
然後沒個詢問找前後兩個點lca,求路徑上的最小邊的限制,這樣就可以求出賣出多少**了
最後要譴責一下非常腦殘的資料,有個資料點是兩條鏈,dfs時會爆棧= =,wa了我兩天十幾次
話說出資料時不應該這樣戲弄別人,非常浪費時間和精力又沒有意義
一定要手寫棧!!
1 #include2 #include3 #include4
#define ll long long
5#define inf 21474836470000
6using
namespace
std;
7const
int maxn = 100010;8
struct
nodee[maxn*2],e[maxn*2
];12
int n,m,q,trade[maxn],fa[maxn][21],fa[maxn],dep[maxn],head[maxn],tot,logn,order[maxn],scc[maxn],bel,st[maxn*10
];13 ll pre[maxn][21
];14
15void insert(int u, int
v, ll c)
1819
bool
cmp(node a, node b)
2223
int find(int
x)26
27void dfs(int u, int
f)41}42
}4344 ll lca(int u, int
v)53 ret=min(ret,pre[u][0
]);54 u=fa[u][0
];55}56
if (u==v) return
ret;
57for (int i=logn; i>=0; i--)
58if (fa[u][i]!=fa[v][i])
63 ret=min(ret,min(pre[v][0],pre[u][0
]));
64return
ret;65}
6667
intmain()92}
93 fa[1][0]=0
;94 dfs(1,0
);95 ll now=0;96
if (trade[order[1]]<0) puts("
0"); else now=trade[order[1
]];97
for (int i=2; i<=n; i++)else
111}
112//
printf("%lld\n", now);
113}
114return0;
115 }
最大生成樹
problem a 古老的羊皮卷 time limit 3 sec memory limit 128 mb description 奇奇,乙個響亮的名字在acm界.如今奇奇已經腰纏萬貫,飛黃騰達,日子過的是無比的滋潤.是什麼使他到了如此的地位?如果你要這麼問,奇奇會不假思索的告訴你 acm 是acm...
最大生成樹
include define pp make pair using namespace std typedef long long ll const int maxn 1e6 30 const int n 260000 const ll mod 1e9 7 const int inf 0x3f3f3...
最大生成樹
最大生成樹演算法和最小生成樹演算法幾乎一樣,只需要我們把最小生成樹演算法進行一點點改變即可。當你用krushal演算法求最小生成樹的時候,每一次選取的邊都是最小的邊,然後再去判斷這條邊是否可以加入最小生成樹 那麼當你每一次選擇的邊是最大的邊,然後再去判斷這條邊是否可以加入,那麼這就是最大生成樹的求取...