您的位置:首页 > 其它

CF 400D - Dima and Bacteria

2014-03-16 22:51 288 查看
#include<stdio.h>
#include<string.h>
#define inf 0x3f3f3f3f
const int N=100015,MAX=505;
int type
,father
,mp[MAX][MAX];

inline int min(int a,int b){
return a>b?b:a;
}
int find(int x){
if(father[x]!=x)
father[x]=find(father[x]);
return father[x];
}
void floyd(int n){//ok
for(int i=1;i<=n;i++)//--nk
mp[i][i]=0;
for(int k=1;k<=n;k++)
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
mp[i][j]=min(mp[i][j],mp[i][k]+mp[k][j]);
}

int main(){
int n,m,K,t,cnt=1;
scanf("%d %d %d",&n,&m,&K);
for(int i=1;i<=K;i++){//为每个细菌标识类别
scanf("%d",&t);
for(int j=0;j<t;j++)
type[cnt++]=i;
}
for(int i=1;i<=n;i++)
father[i]=i;
memset(mp,inf,sizeof mp);
int u,v,z;
for(int i=0;i<m;i++){
scanf("%d %d %d",&u,&v,&z);
if(z==0){//合并0转换的集合
u=find(u);v=find(v);
if(u!=v)
father[u]=v;
}
int x=type[u],y=type[v];
mp[x][y]=min(mp[x][y],z);
mp[y][x]=min(mp[y][x],z);
}
for(int i=2;i<=n;i++){//类型相同则必连通
if(type[i]==type[i-1]&&find(i-1)!=find(i)){
printf("No\n");return 0;
}
}
floyd(K);
printf("Yes\n");
for(int i=1;i<=K;i++){
for(int j=1;j<=K;j++)
printf("%d%c",mp[i][j]==inf?-1:mp[i][j],j==K?'\n':' ');
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: