题意:n点,m条带权边的无向图,每个顶点属于k类中的某一类,定义合法,同一类中的任意两点存在代价为0的路径,若合法,求出d[i][j]矩阵,表示第i类到第j类的最小代价.

n,m<=1e5,k<=500,wi<=1e4

同一个类有c[i]个点 则要有c[i]*(c[i]-1)/2条权值为0的路径.相同type转化时,不会经过非0边

首先把边权为0两个端点扔到同一个联通分量中,算出该联通分量中每个type的个数,更新该type路径个数即可判断是否合法.O(M) ...其实相同type必须在同一个联通分量中,否则没有代价0路径存在,用并查集即可.

若合法,则以type为定点,type间的最小代价为边建图(因为相同type间代价为0)

然后跑一遍即可 O(K^3)

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> ii;
const int N=2e5+20;
const int M=5e2+20;
const ll inf=2e15;
vector<int> e[N];
ll d[M][M];
ll n,m,k,c[N],l[N],b[N],a[N];//l[i] type[i]'s left pos
int vis[N],id[N];
int get(int x)
{for(int i=k;i>=1;i--){if(x>=l[i])return i;}
}
void dfs(int u)
{vis[u]=1;a[id[u]]++;for(int i=0;i<e[u].size();i++)if(!vis[e[u][i]])dfs(e[u][i]);
}
bool check()
{memset(vis,0,sizeof(vis));memset(b,0,sizeof(b));for(int i=1;i<=n;i++){if(!vis[i]){memset(a,0,sizeof(a));dfs(i); for(int j=1;j<=k;j++)b[j]+=a[j]*(a[j]-1)/2;}}for(int i=1;i<=k;i++)if(b[i]!=c[i]*(c[i]-1)/2)return false;return true;
}
bool floyd()
{for(int p=1;p<=k;p++)for(int i=1;i<=k;i++)for(int j=1;j<=k;j++)d[i][j]=min(d[i][j],d[i][p]+d[p][j]);printf("Yes\n");for(int i=1;i<=k;i++){if(c[i]==1)d[i][i]=0;for(int j=1;j<=k;j++){if(d[i][j]>=inf)d[i][j]=-1;printf("%I64d%c",d[i][j],j==k?'\n':' ');}}
}
int main()
{while(cin>>n>>m>>k){ll num=0,zero=0,u,v,w;l[1]=1;for(int i=1;i<=k;i++)scanf("%d",&c[i]),num+=c[i]-1,l[i+1]=l[i]+c[i];for(int i=1;i<=n;i++)id[i]=get(i),e[i].clear();    for(int i=1;i<=k;i++)for(int j=1;j<=k;j++)d[i][j]=inf;for(int i=0;i<m;i++){scanf("%d%d%I64d",&u,&v,&w);if(w==0)e[u].push_back(v),e[v].push_back(u);u=get(u),v=get(v);d[u][v]=min(d[u][v],w);d[v][u]=min(d[v][u],w);}if(check()==false){puts("No");continue;}floyd();}return 0;
}

Codeforces 400D Dima And Bacteria 暴力+Floyd相关推荐

  1. codeforces 400D Dima and Bacteria 并查集+floyd

    题目链接:http://codeforces.com/problemset/problem/400/D 题目大意: 给定n个集合,m步操作,k个种类的细菌, 第二行给出k个数表示连续的xi个数属于i集 ...

  2. codeforces 400D - Dima and Bacteria

    题目链接:http://codeforces.com/problemset/problem/400/D 题目大意:n个培养基,m种仪器,分成k种,每种细菌数量c[i],然后就给出从第i到第j个培养基转 ...

  3. CodeForces 400D Dima and Bacteria

    题意: 有n个点  它们有自己的type  给出m条边  首先要求判断可否用0费用在同样type的点中走  如果可以  用type为点建图求任意两点最短路 思路: type只有500种  最后一步可以 ...

  4. TTTTTTTTTTT 400D Dima and Bacteria 细菌 最短路

    题意: 题目大意:给出n,m和k,表示有n个细菌,m种仪器和k种细菌,给出k种细菌的数量ci,然后每个细菌按照种类排成一排(所以有第i种细菌的序号从∑(1≤j≤i-1)cj + 1 到∑(1≤j≤i) ...

  5. CF 400D Dima and Bacteria

    最短路问题.先求是否和谐,即内部成员之间可0权连接.并查集解决.然后弗洛伊德算法解决.注意点从0开始,在读入点时记得减1.第一个最短路.注意最外层循环不可以内置,必须遵循此顺序. #include & ...

  6. CF400D Dima and Bacteria(并查集+Floyd)

    首先判断是否可行,把0边链接的点都合并起来,看每一种类的所有点是不是都在一个集合内.然后缩成500个点,跑Floyd即可. #include <bits/stdc++.h> using n ...

  7. [ An Ac a Day ^_^ ] CodeForces 691F Couple Cover 花式暴力

    Couple Cover Time Limit: 3000MS   Memory Limit: 524288KB   64bit IO Format: %I64d & %I64u Descri ...

  8. CODEFORCES 272C Dima and Staircase 细节理解题+简单技巧

    传送门:http://codeforces.com/problemset/problem/272/C C. Dima and Staircase time limit per test 2 secon ...

  9. Codeforces gym 100685 A. Ariel 暴力

    A. Ariel Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100685/problem/A Des ...

最新文章

  1. JavaScript中的加法运算
  2. 【WPF】鼠标拖拽功能DragOver和Drop
  3. 【Python】写视频的2种常用方法:write_videofile和videoWrite
  4. pytorch中的批量归一化BatchNorm1d和BatchNorm2d的用法、原理记录
  5. 金士顿 datatraveler写保护_【脑洞大开】金士顿推出限量版羽毛球闪存盘
  6. altium 网口差分走线长度_差分信号的优缺点及布线要求
  7. Mysql学习总结(69)——Mysql EXPLAIN 命令使用总结
  8. python调用什么函数实现对文件内容的读取_python读取文本文件数据
  9. win 10专业版中虚拟机里面无法按打开centos镜像
  10. 又见黑科技!量子薄膜传感器或推动VR设备变革
  11. Django的cmdb探索与开发(三)
  12. 【编译原理】什么是上下文无关文法、上下文有关文法?
  13. TFS2010中如何添加用户
  14. 程序员的英文简历编写参考
  15. MPB:中科院植物所杨文强组-​莱茵衣藻遗传连锁分析方法
  16. 毫米、微米、英寸、目数对照表
  17. 记:EVE模拟器拓扑配置的保存及导入
  18. 【ninja】Windows下安装ninja环境
  19. 渗透之——PowerShell基本命令和绕过权限执行
  20. 2021考生如何做考博英语复习规划?

热门文章

  1. 景德镇人都应该知道的一个历史人物--唐英
  2. 判断是否有统计意义/差异具有显著性/具有显著差异/零假设(希望证明为错误的假设)/卡方检验
  3. codeforces 776 D The Door Problem
  4. 短视频转发平台是什么意思?
  5. 法学论文应该注重论证形式
  6. Selenium 爬取京东商品信息并分页保存
  7. C#绘制带控制点的Bezier曲线,用于点阵图像及矢量图形
  8. ovirt guest agent 安装
  9. Asp RequiredFieldValidator,CompareValidator简单使用
  10. 存储区域网络SAN简介