Codeforces 400D Dima And Bacteria 暴力+Floyd
题意: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相关推荐
- codeforces 400D Dima and Bacteria 并查集+floyd
题目链接:http://codeforces.com/problemset/problem/400/D 题目大意: 给定n个集合,m步操作,k个种类的细菌, 第二行给出k个数表示连续的xi个数属于i集 ...
- codeforces 400D - Dima and Bacteria
题目链接:http://codeforces.com/problemset/problem/400/D 题目大意:n个培养基,m种仪器,分成k种,每种细菌数量c[i],然后就给出从第i到第j个培养基转 ...
- CodeForces 400D Dima and Bacteria
题意: 有n个点 它们有自己的type 给出m条边 首先要求判断可否用0费用在同样type的点中走 如果可以 用type为点建图求任意两点最短路 思路: type只有500种 最后一步可以 ...
- TTTTTTTTTTT 400D Dima and Bacteria 细菌 最短路
题意: 题目大意:给出n,m和k,表示有n个细菌,m种仪器和k种细菌,给出k种细菌的数量ci,然后每个细菌按照种类排成一排(所以有第i种细菌的序号从∑(1≤j≤i-1)cj + 1 到∑(1≤j≤i) ...
- CF 400D Dima and Bacteria
最短路问题.先求是否和谐,即内部成员之间可0权连接.并查集解决.然后弗洛伊德算法解决.注意点从0开始,在读入点时记得减1.第一个最短路.注意最外层循环不可以内置,必须遵循此顺序. #include & ...
- CF400D Dima and Bacteria(并查集+Floyd)
首先判断是否可行,把0边链接的点都合并起来,看每一种类的所有点是不是都在一个集合内.然后缩成500个点,跑Floyd即可. #include <bits/stdc++.h> using n ...
- [ An Ac a Day ^_^ ] CodeForces 691F Couple Cover 花式暴力
Couple Cover Time Limit: 3000MS Memory Limit: 524288KB 64bit IO Format: %I64d & %I64u Descri ...
- CODEFORCES 272C Dima and Staircase 细节理解题+简单技巧
传送门:http://codeforces.com/problemset/problem/272/C C. Dima and Staircase time limit per test 2 secon ...
- Codeforces gym 100685 A. Ariel 暴力
A. Ariel Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100685/problem/A Des ...
最新文章
- JavaScript中的加法运算
- 【WPF】鼠标拖拽功能DragOver和Drop
- 【Python】写视频的2种常用方法:write_videofile和videoWrite
- pytorch中的批量归一化BatchNorm1d和BatchNorm2d的用法、原理记录
- 金士顿 datatraveler写保护_【脑洞大开】金士顿推出限量版羽毛球闪存盘
- altium 网口差分走线长度_差分信号的优缺点及布线要求
- Mysql学习总结(69)——Mysql EXPLAIN 命令使用总结
- python调用什么函数实现对文件内容的读取_python读取文本文件数据
- win 10专业版中虚拟机里面无法按打开centos镜像
- 又见黑科技!量子薄膜传感器或推动VR设备变革
- Django的cmdb探索与开发(三)
- 【编译原理】什么是上下文无关文法、上下文有关文法?
- TFS2010中如何添加用户
- 程序员的英文简历编写参考
- MPB:中科院植物所杨文强组-​莱茵衣藻遗传连锁分析方法
- 毫米、微米、英寸、目数对照表
- 记:EVE模拟器拓扑配置的保存及导入
- 【ninja】Windows下安装ninja环境
- 渗透之——PowerShell基本命令和绕过权限执行
- 2021考生如何做考博英语复习规划?