#include <bits/stdc++.h> using namespace std; #define ll long long //# define int long long #define ull unsigned long long #define pii pair<int,int> #define double long double #define baoliu(x, y) cout << fixed << setprecision(y) << x #define endl "\n"
const int N = 2e5 + 10; const int M = 1e6 + 10; const int inf = 0x3f3f3f3f; const int mod = 998244353; const double eps = 1e-8; int n, m; int a[N]; int d[502][502]; int k;//k类 unordered_map<int,int>mp;//按类别缩点以后的根对应的编号 int cnt=0;//记录当前是第几个类 void floyd(){ for(int v=1;v<=k;v++){ for(int i=1;i<=k;i++){ for(int j=1;j<=k;j++){ d[i][j]=min(d[i][v]+d[v][j],d[i][j]); } } } } struct DSU { vector<int> f, siz; DSU() {} DSU(int n) { init(n); } void init(int n) { f.resize(n); std::iota(f.begin(), f.end(), 0); siz.assign(n, 1); } int find(int x) { while (x != f[x]) { x = f[x] = f[f[x]]; } return x; } bool same(int x, int y) { return find(x) == find(y); } bool merge(int x, int y) { x = find(x); y = find(y); if (x == y) { return false; } siz[x] += siz[y]; f[y] = x; return true; } int size(int x) { return siz[find(x)]; } }; void solve(){ cin>>n; DSU dsu(n+1);DSU fn(n+1); cin>>m; cin>>k; int val=1; for(int i=1;i<=k;i++){ mp[val]=++cnt; int c; cin>>c; for(int j=val;j<=val+c-1;j++){ dsu.merge(val,j); } val=val+c; } for (int i = 1; i <= k; i ++ ) for (int j = 1; j <= k; j ++ ) if (i == j) d[i][j] = 0; else d[i][j] = inf; while(m--){ int u,v,w; cin>>u>>v>>w; int r1=dsu.find(u),r2=dsu.find(v); if(r1==r2){ if(w)continue; else { fn.merge(u,v); } } else { if(w==0)fn.merge(u,v); int ve1=mp[r1],ve2=mp[r2]; d[ve2][ve1]=d[ve1][ve2]=min(d[ve1][ve2],w); } } //bool flag=true; for(int i=2;i<=n;i++){ int s1=dsu.find(i-1),s2=dsu.find(i);//类别 int r1=fn.find(i-1),r2=fn.find(i);//仅通过0边看是不是联通 if(s1==s2&&r1!=r2){ cout<<"No"<<endl;; return ; } } cout<<"Yes"<<endl; floyd(); for(int i=1;i<=k;i++){ for(int j=1;j<=k;j++){ if(d[i][j]==inf)cout<<-1<<" "; else cout<<d[i][j]<<" "; } cout<<endl; } } int main() { cin.tie(0); cout.tie(0); ios::sync_with_stdio(false);