题意: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
*/

 京公网安备 11010502036488号
京公网安备 11010502036488号