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; }
相关文章推荐
- Codeforces 400D. Dima and Bacteria【并查集+最短路】
- CF 272 B. Dima and Sequence
- CF 272B Dima and Sequence
- cf D. Dima and Hares
- CF 272 C. Dima and Staircase
- CF 366E - Dima and Magic Guitar 最远曼哈顿距离
- CF 358C C. Dima and Containers 离线+模拟
- CF 366E - Dima and Magic Guitar 最远曼哈顿距离
- cf B. Dima and To-do List
- CF Round #324 (Div2) D. Dima and lisa
- Codeforces 400D Dima And Bacteria 暴力+Floyd
- Codeforces Round #234 (Div. 2) D. Dima and Bacteria
- CF10月25日比赛。(Dima and Continuous Line)
- CF-358D-Dima and Hares【T^T+*^*】
- 【简单题】-CF-390B-Inna, Dima and Song
- CodeForces 400D Dima and Bacteria
- Dima and Bacteria CodeForces - 400D [最短路+缩点] 好题~
- cf C. Dima and Salad
- CF10月25日比赛。(Dima and Text Messages)
- cf D. Dima and Lisa (三素数定理_素数打表+判定)