本題 kruskal+倍增lca
wa了三次 t_t
總結出一些注意事項:
1. 一定要想明白每一部分是求最大值還是最小值!!!(wa 1)
2. 注意操作順序,別把要用的變數的數值改沒!!!(wa 2)
3. 仔細看題,如本題讓「」貨車不能到達目的地,輸出-1「」,而貨車載重為零則應輸出0!!!!!!(wa 3)
#include
#include
#include
#include
using
namespace
std;
struct edg
edge[50004];
int n,m;
int q;
bool cmp(edg a,edg b)
int min(int a,int b)
void unionn(int a,int b)
int to[30004],val[30004],nextt[30004],head[10004],cnt;
void add(int a,int b,int c)
int fa[10004][16];
int minn[10004][16];
int deep[10004];
void add_root()
}}int visited[10004];
void dfs(int pos,int pre,int step,int vv)
}}void swap(int &a,int &b)
int lca_min(int x,int y)
}if(x==y) return ans;
for(int i=15;i>=0;i--)
else
}ans=min(ans,minn[x][0]);
ans=min(ans,minn[y][0]);
return ans;
}int main()
sort(edge+1,edge+m+1,cmp);
for(int i=1;i<=n;i++) father[i]=i;
for(int i=1;i<=m;i++)
}memset(minn,0x3f,sizeof(minn));
add_root();
dfs(n+1,n+1,0,0);
for(int j=1;j<=15;j++)
}scanf("%d",&q);
for(int i=1;i<=q;i++)
return
0;}
附上幾組資料:
/*
5 85 4 1
4 2 3
5 3 4
3 1 6
5 1 6
4 2 0
4 2 0
1 2 9
51 5
4 31 4
4 13 4
*//*
5 52 5 3
5 3 0
1 2 9
3 2 0
4 2 8
53 2
2 13 4
5 21 2
*//*
6 85 3 7
3 2 3
6 5 2
2 3 6
1 3 6
4 1 3
2 6 9
4 1 1
16 4
*/
火車運輸(NOIP2013)
傳送藥水 喝了這一壺傳送藥水,保你看了什麼題都覺得神清氣爽 這題不算水。首先想到,肯定需要跑一遍最大生成樹,因為我們需要盡可能大的限制。那麼,接下來就是求兩點之間最小限制。那麼就是我們就可以用求lca 最近公共祖先 來解決這個問題。所以就倍增好了。我們這裡倍增的有兩個陣列,乙個是祖先,另乙個是當前點...
NOIP 2013 提高組 貨車運輸
a 國有 n 座城市,編號從 1 到 n,城市之間有 m 條雙向道路。每一條道路對車輛都有重量限制,簡稱限重。現在有 q 輛貨車在運輸貨物,司機們想知道每輛車在不超過車輛限重的情況下,最多能運多重的貨物。第一行有兩個用乙個空格隔開的整數 n,m,表示 a 國有 n 座城市和 m 條道路。接下來 m ...
NOIP2013提高組 貨車運輸
noip2013 提高組 day1 試題。a 國有 n 座城市,編號從 1 到 n,城市之間有 m 條雙向道路。每一條道路對車輛都有重量限制,簡稱限重。現在有 q 輛貨車在運輸貨物,司機們想知道每輛車在不超過車輛限重的情況下,最多能運多重的貨物。第一行有兩個用乙個空格隔開的整數 n m,表示 a 國...