HDU 5441 Travel(最短路径变形)
2015-09-24 12:21
351 查看
/*题意:有一个n个点的无向图,给出m条边的边权,给出q次询问,每次给出一个值,求用到所有边权不大于这个值的边的情况下,能够互相到达的点对的个数(自己到自己不算) 分析: 先把路线按照权值从小到大排序,然后再把那几个值按从小到大排序。后面就是一系列最短路径问题了,貌似不难*/ #include<stdio.h> #include<string.h> #include<algorithm> using namespace std; const int maxm=1e5; int n,m,k; int num[maxm]; int p[maxm]; int ans[maxm]; void Init() { for(int i=0;i<=maxm;i++) { p[i]=i; num[i]=1; } } struct node { int u,v,c; bool operator<(const node &s)const { return c<s.c; } }t[maxm]; struct NODE { int w,id; bool operator<(const NODE &p)const { return w<p.w; } }T[maxm]; int find(int k) { if(p[k]!=k) { return p[k]=find(p[k]); } else { return p[k]; } } int main() { int y; scanf("%d",&y); while(y--) { Init(); memset(ans,0,sizeof(ans)); scanf("%d%d%d",&n,&m,&k); for(int i=0;i<m;i++) { scanf("%d%d%d",&t[i].u,&t[i].v,&t[i].c); } sort(t,t+m); for(int i=0;i<k;i++) { scanf("%d",&T[i].w); T[i].id=i; } sort(T,T+k); int j=0; int cnt=0; for(int i=0;i<k;i++) { while(j<m&&t[j].c<=T[i].w) { int x=find(t[j].u); int y=find(t[j].v); j++; if(x!=y) { p[x]=y; cnt+=(num[x]*num[y]); num[y]+=num[x]; } } ans[T[i].id]=2*cnt; } for(int i=0;i<k;i++) { printf("%d\n",ans[i]); } } return 0; }
相关文章推荐
- 说说Makefile那些事儿
- checkbox全选和取消全选
- 有名管道
- 硬盘大于2T以上,用parted创建分区安装centos6.5
- 统计英文单词词频
- 日经春秋 20150924
- MSDN ATL教程链接,好好学习,天天向上
- C#Winform定时执行一段程序
- 根据当期日期计算,农历日期的类
- leetcode 95-96:Unique Binary Search Trees
- sublime配置记录
- 关于中部城市人才外流问题的思考
- 在Lufylegend中如何设置bitmap或者sprite的缩放和旋转中心
- 查找当前目录下包含特定字符串的特殊后缀名的文件
- 工作小结
- Ubuntu 14.04中编译kermit
- Qt中以固定格式写批量int型数据至文件之格式控制(数字对齐)
- Navicat for MySQL(mysql图形化管理工具)是什么?
- poj 1077 八数码
- <s:checkbox> fieldValue取值问题