题意:n个细菌,m个无向边,k个种类 . 输入k种类的个数c[i] sigmac[i]==n,编号按种类来排序.
比如3个种类数量分别为 2 3 4 那么编号1~2属于种类1,3~5属于种类2,6~9属于种类3
同种细菌之间的权值都为0.如果不满足,输出NO.满足,输出多源最短路的距离矩阵
判断不满足:并查集把dis=0的点合并,接下来对c[i]判断
满足的话:输出YES,缩c[i]点为一个点,k<=500,那么O(k^3)的复杂度求出多源最短路,这题不能用bfs,因为权值不相等
#include <bits/stdc++.h>
#define MOD 1000000007
#define INF 0x3f3f3f3f
#define bug1 cout << "bug1" << endl
#define bug2 cout << "bug2" << endl
#define bug3 cout << "bug3" << endl
#define bug4 cout << "bug4" << endl
#pragma comment(linker, "/STACK:102400000,102400000")
using namespace std;
typedef long long ll;
const int MAX_N=3000+3;
int c[505],par[100005],dis[600][600],ans[600][600],n,m,k;
map<int,int> mp;
int Find(int x){
return x==par[x]? x : par[x]=Find(par[x]) ;
}
bool check(){
int index=1;
for(int i=1;i<=k;i++){
int x=Find(index++);
for(int j=2;j<=c[i];++j){
if(x!=Find(index++)) return false;
}
}
return true;
}
void dijkstra(int st){
int vis[600];
memset(vis,0,sizeof(vis));
for(int i=1;i<=k;i++) ans[st][i]=dis[st][i];
ans[st][st]=0;
vis[st]=1;
for(int i=1;i<=k-1;i++){
int mn=INF,index=1;
for(int j=1;j<=k;j++){
if(!vis[j] && ans[st][j]<mn){
index=j,mn=ans[st][j];
}
}
vis[index]=1;
for(int j=1;j<=k;j++){
if(!vis[j]) ans[st][j]=min(ans[st][j],ans[st][index]+dis[index][j]);
}
}
return ;
}
int main(void){
cin >> n>> m >>k;
memset(dis,INF,sizeof(dis));
for(int i=1;i<=n;i++) par[i]=i;
for(int i=1;i<=k;i++) scanf("%d",&c[i]);
int index=1;
for(int i=1;i<=k;i++){
for(int j=1;j<=c[i];j++){
mp[index++]=i;
}
}
for(int i=1;i<=m;i++){
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
if(!w){
int a=Find(u);
int b=Find(v);
par[a]=b;
dis[mp[u]][mp[v]]=0,dis[mp[v]][mp[u]]=0;
}
else{
dis[mp[u]][mp[v]]=min(dis[mp[u]][mp[v]],w);
dis[mp[v]][mp[u]]=min(dis[mp[v]][mp[u]],w);
}
}
if(!check()){
cout <<"No"<<endl;
return 0;
}
// for(int i=1;i<=k;i++){
// for(int j=1;j<=k;j++) printf("%d ",dis[i][j]);puts("");
// }
memset(ans,INF,sizeof(ans));
for(int i=1;i<=k;i++) dijkstra(i);
cout <<"Yes" <<endl;
for(int i=1;i<=k;i++){
for(int j=1;j<=k;j++){
if(ans[i][j]==INF) cout <<"-1 ";
else printf("%d ",ans[i][j]);
}
puts("");
}
return 0;
}
/*
4 4 2
1 3
2 3 0
3 4 0
2 4 1
2 1 2
*/