貨車運輸 洛谷p1967

2021-08-10 03:25:46 字數 2603 閱讀 1336

解法一(30分):

直接跑spfa,求最大瓶頸路。

#include#include#include#define f(i,l,r) for(i=(l);i<=(r);i++)

using namespace std;

const int maxn=10005,maxm=50005,inf=100000000;

struct edgee[maxm<<1];

int head[maxn],tot;

int n,m,q;

int dis[maxn],inq[maxn],q[maxn];

inline void add(int u,int v,int w)

inline void spfa(int s,int t)

cin>>q;

f(i,1,q)

return 0;

}

解法二(60分)

最後的路徑一定在最大生成樹上,於是先跑出最大生成樹,然後在樹上跑spfa。

#include#include#include#define f(i,l,r) for(i=(l);i<=(r);i++)

using namespace std;

const int maxn=10005,maxm=50005,inf=100000000;

struct node

}a[maxm];

struct edgee[maxm<<1];

int head[maxn],tot;

int n,m,q;

int dis[maxn],inq[maxn],q[maxn];

int fa[maxn];

inline void makeset()

inline int find(int x)

inline bool unionset(int x,int y)

inline void add(int u,int v,int w)

inline void spfa(int s,int t)

sort(a+1,a+1+m);

f(i,1,m)

}cin>>q;

f(i,1,q)

return 0;

}

解法三(100分):

樹上倍增。

#include#include#include#define f(i,l,r) for(i=(l);i<=(r);i++)

#define ff(i,r,l) for(i=(r);i>=(l);i--)

using namespace std;

const int maxn=10005,maxm=50005,inf=100000000;

struct node

}a[maxm];

struct edgee[maxm<<1];

int head[maxn],tot;

int n,m,q;

int dis[maxn],inq[maxn],q[maxn];

int fa[maxn];

int dep[maxn],fa[maxn][20],vis[maxn],d[maxn][20];

inline void dfs(int u)

sort(a+1,a+1+m);

f(i,1,m)

} f(i,1,n)

// f(i,1,n) cout<>q;

f(i,1,q)e[maxn<<1];

struct node

}a[maxm];

inline void makeset()

inline int find(int x)

inline bool unionset(int x,int y)

inline void add(int u,int v,int w)

inline void dfs1(int u)

}inline void dfs2(int u,int anc)

for(i=head[u];~i;i=e[i].next)

}inline void pushup(int x)

inline void build(int x,int l,int r)

if(l>1;

build(x<<1,l,mid);

build(x<<1|1,mid+1,r);

pushup(x); }}

inline void query(int x,int l,int r,int sj,int tj)

int mid=l+r>>1;

if(mid>=sj) query(x<<1,l,mid,sj,tj);

if(mid+1<=tj) query(x<<1|1,mid+1,r,sj,tj);

}inline void work(int x,int y)

sort(a+1,a+1+m);

f(i,1,m)

} f(i,1,n)

} build(1,1,n);

cin>>q;

f(i,1,q){

cin>>u>>v;

if(find(u)!=find(v)) cout<<-1<

洛谷 P1967 貨車運輸

a 國有 n 座城市,編號從 1 到 n,城市之間有 m 條雙向道路。每一條道路對車輛都有重量限制,簡稱限重。現在有 q 輛貨車在運輸貨物,司機們想知道每輛車在不超過車輛限重的情況下,最多能運多重的貨物。輸入檔名為 truck.in。輸入檔案第一行有兩個用乙個空格隔開的整數 n,m,表示 a 國有 ...

洛谷 P1967 貨車運輸

題目描述 a 國有 n 座城市,編號從 1 到 n,城市之間有 m 條雙向道路。每一條道路對車輛都有重量限制,簡稱限重。現在有 q 輛貨車在運輸貨物,司機們想知道每輛車在不超過車輛限重的情況下,最多能運多重的貨物。輸入輸出格式 輸入格式 輸入檔名為 truck.in。輸入檔案第一行有兩個用乙個空格隔...

洛谷P1967貨車運輸

這道題 首先不難看出要先求乙個最大生成樹,因為我們在盡量圖聯通的情況下,使兩點之間有一條權值最大的邊,所以kru跑一遍最大生成樹 然後會有很顯然的事情就是裸的生成樹只能求總和,但我們需要知道樹上有哪條邊,所以在合併兩個聯通塊時,將兩個端點以及他們間的邊加入另乙個圖中,那麼顯然新圖中只包含最大生成樹上...