1 条题解
-
1
#include<bits/stdc++.h> // #define ONLINE_JUDGE #define INPUT_DATA_TYPE int #define OUTPUT_DATA_TYPE int INPUT_DATA_TYPE read(){register INPUT_DATA_TYPE x=0;register char f=0,c=getchar();while(c<'0'||'9'<c)f=(c=='-'),c=getchar();while('0'<=c&&c<='9')x=(x<<3)+(x<<1)+(c&15),c=getchar();return f?-x:x;}void print(OUTPUT_DATA_TYPE x){if(x<0)x=-x,putchar('-');if(x>9)print(x/10);putchar(x%10^48);return;} const int UFDS_SIZE=510; struct UFDS{ int parents[UFDS_SIZE]; void build(int n){ for(register int i=1;i<=n;++i) parents[i]=i; return; } int find(int x){ return x==parents[x]?x:(parents[x]=find(parents[x])); } int find_b(int x){ while(parents[x]!=x) x=parents[x]; return x; } void merge(int i,int j){ parents[find(i)]=find(j); return; } void clear(){ for(int i=1;i<UFDS_SIZE;i++) parents[i]=i; return; } }UB,UC; #define NOOOOOO \ {puts("NO");\ return 0;} struct EDGE{ int u,v,w; bool operator < (const EDGE o) const{ return w>o.w; } }; std::vector<EDGE> edges_b,edges_c,outE; int B[510][510],C[510][510],Bnew[510][510],Cnew[510][510]; int main(){ #ifndef ONLINE_JUDGE freopen("name.in", "r", stdin); freopen("name.out", "w", stdout); #endif memset(Bnew,~0x3f,sizeof(Bnew)); memset(Cnew,~0x3f,sizeof(Cnew)); register int i,j,k,u,v,W; int n=read(); W=read(); for(u=0;u<n;++u) for(v=0;v<u;++v) B[u][v]=B[v][u]=read(); for(u=0;u<n;++u) for(v=0;v<u;++v) C[u][v]=C[v][u]=read(); for(u=0;u<n;++u) for(v=0;v<u;++v) for(k=0;k<n;++k) if(k!=u&&k!=v&&(B[u][v]<std::min(B[u][k],B[k][v])||C[u][v]<std::min(C[u][k],C[k][v]))) NOOOOOO for(u=0;u<n;++u) for(v=0;v<u;++v) if(B[u][v]+C[u][v]>=W){ edges_b.push_back((EDGE){u,v,B[u][v]}); edges_c.push_back((EDGE){u,v,C[u][v]}); } std::sort(edges_b.begin(),edges_b.end()); std::sort(edges_c.begin(),edges_c.end()); UB.build(n),UC.build(n); for(auto edge:edges_b) if(UB.find(edge.u)!=UB.find(edge.v)) Bnew[edge.u][edge.v]=Bnew[edge.v][edge.u]=edge.w, outE.push_back((EDGE){edge.u,edge.v,W-edge.w}), UB.merge(edge.u,edge.v); for(auto edge:edges_c) if(UC.find(edge.u)!=UC.find(edge.v)) Cnew[edge.u][edge.v]=Cnew[edge.v][edge.u]=edge.w, outE.push_back(edge), UC.merge(edge.u,edge.v); for(k=0;k<n;++k) for(u=0;u<n;++u) for(v=0;v<u;++v) if(k!=u&&k!=v) Bnew[u][v]=Bnew[v][u]=std::max(Bnew[u][v],std::min(Bnew[u][k],Bnew[k][v])), Cnew[u][v]=Cnew[v][u]=std::max(Cnew[u][v],std::min(Cnew[u][k],Cnew[k][v])); for(u=0;u<n;++u) for(v=0;v<u;++v) if(B[u][v]!=Bnew[u][v]||C[u][v]!=Cnew[u][v]||Bnew[u][v]<0||Cnew[u][v]<0) NOOOOOO print(outE.size()),putchar('\n'); for(auto edge:outE) print(edge.u),putchar(' '),print(edge.v),putchar(' '),print(edge.w),putchar('\n'); #ifndef ONLINE_JUDGE fclose(stdin); fclose(stdout); #endif return 0; }
信息
- ID
- 13439
- 时间
- 5000ms
- 内存
- 1024MiB
- 难度
- 6
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者