#include<bits/stdc++.h>usingnamespace std;constint N =300050;constint M = N*2;int n,m,a[N],t1,t2;int head[N], cnt;structEdge{int u,v,next;}edge[M];voidadd(intu,intv){
edge[++cnt].u= u;
edge[cnt].v= v;
edge[cnt].next= head[u];
head[u]= cnt;}int fa[N][31], d[N];voiddfs(intu,intfaa){
fa[u][0]= faa, d[u]= d[faa]+1;for(int i =1; i <=25; i++){
fa[u][i]= fa[ fa[u][i -1]][i -1];}for(int i = head[u]; i ; i = edge[i].next){int v = edge[i].v;if(v == faa)continue;dfs(v, u);}}intlca(intx,inty){if(d[x]< d[y])swap(x,y);for(int i =25; i >=0; i--){if(d[ fa[x][i]]>= d[y]) x = fa[x][i];}if(x == y)return x;for(int i =25; i >=0; i--){if(fa[x][i]!= fa[y][i]){
x = fa[x][i], y = fa[y][i];}}return fa[x][0];}int num[N];intdfs2(intu,intfaa){for(int i = head[u]; i ; i = edge[i].next){int v = edge[i].v;if(v == faa)continue;dfs2(v, u);
num[u]+= num[v];}}intmain(){
cin>>n;for(int i =1; i <= n; i++){
cin>> a[i];}for(int i =1; i < n; i++){
cin>> t1>> t2;add(t1, t2);add(t2, t1);}dfs(1,0);for(int i =1; i <= n -1; i++){int u = a[i], v = a[i +1];int t =lca(u, v);
num[ fa[t][0]]-=1;
num[ t ]-=1;
num[ u ]+=1;
num[ v ]+=1;}dfs2(1,0);for(int i =2; i <= n; i++){
num[a[i]]--;}for(int i =1; i <= n; i++){
cout<<num[i]<<endl;}}
#include <bits/stdc++.h>
using namespace std;
const int sHo = 20001;
int n, k, m, fa[sHo], flag[sHo], ans, cnt;
struct node {
int u, v, c1, c2, num;
} road[sHo];
bool cmp1(node x, node y) { return x.c1 < y.c1; }
bool cmp2(node x, node y) { return x.c2 < y.c2; }
int find(int x) {
if (x == fa[x])
return x;
return fa[x] = find(fa[x]);
}
signed main() {
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin >> n >> k >> m;
m--;
for (int i = 1; i <= n; i++) fa[i] = i;
for (int i = 1; i <= m; i++) {
cin >> road[i].u >> road[i].v >> road[i].c1 >> road[i].c2;
road[i].num = i;
}
sort(road + 1, road + 1 + m, cmp1);
for (int i = 1; i <= m; i++) {
int p = find(road[i].u);
int q = find(road[i].v);
if (p != q) {
fa[q] = p;
ans = max(ans, road[i].c1);
flag[road[i].num] = 1;
cnt++;
}
if (cnt == k) {
k = i;
break;
}
}
sort(road + k + 1, road + 1 + m, cmp2);
for (int i = k + 1; i <= m; i++) {
int p = find(road[i].u);
int q = find(road[i].v);
if (p != q) {
fa[q] = p;
ans = max(ans, road[i].c2);
flag[road[i].num] = 2;
}
}
cout << ans << '\n';
for (int i = 1; i <= m; i++)
if (flag[i] > 0)
cout << i << ' ' << flag[i] << '\n';
return 0;
}
共 27 条回复
long long
#include<bits/stdc++.h> using namespace std; int n,m,father[5001],p,q,h=0,ans=0,cn;
struct node{ int f,t,c; }a[200001];
bool cmp1(node a,node b){ return a.c<b.c; } int find(int x){ if (father[x]==x){ return x; } else{ father[x]=find(father[x]); return father[x]; } } void add(int x,int y) { p=find(x);q=find(y); if (p!=q){ father[p]=q; } } int main(){ cin>>n>>m; cn=n;
for (int i=1;i<=n;i++){ father[i]=i;
} for (int i=1;i<=m;i++){ cin>>a[i].f>>a[i].t>>a[i].c; } sort(a+1,a+m+1,cmp1);
n--; while (n>0){ h++; if (h>m){ cout<<"orz"; return 0; } if (find(a[h].f)==find(a[h].t)){ continue; } else{ add(a[h].f,a[h].t);
n--; ans+=a[h].c;
} } cout<<ans; return 0; }
dijkstra
https://blog.zhangjy.top/img/733.png