标签:
Time Limit: 1500/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)
Total Submission(s): 1583 Accepted Submission(s): 564
题意:Jack喜欢到处旅游,但是他在不停的行程中确有时间限制,超过时间就会晕车。当然他到达某一个地方会休息。给一他在行程中会晕车的时间限制,问他可以有多少像(a->b这样的旅游路线,当然b->a看做是不同的。输入数据给你n个city,m个路线,q个查询。m个路线,每个路线有x->y,及x->y的行程时间。
Attention:TLE,由时间转化成空间……就是先打表
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 6 using namespace std; 7 8 #define maxn 100008 9 10 int f[maxn], num[maxn], Harsh[maxn]; 11 12 struct node 13 { 14 int u, v, d; 15 }P[maxn]; 16 17 int found(int x) 18 { 19 if(f[x] != x) 20 f[x] = found(f[x]); 21 return f[x]; 22 } 23 24 int cmp(node a, node b) 25 { 26 return a.d < b.d; 27 } 28 29 int main() 30 { 31 int c, n, m, q, s, maxx; 32 scanf("%d", &c); 33 while(c--) 34 { 35 maxx = 0; 36 scanf("%d%d%d", &n, &m, &q); 37 for(int i = 0; i <= n; i++) 38 f[i] = i, num[i] = 1; // num最开始初始化为1…… 39 memset(Harsh, 0, sizeof(Harsh)); 40 41 for(int i = 0; i < m; i++) 42 { 43 scanf("%d%d%d", &P[i].u, &P[i].v, &P[i].d); 44 maxx = max(maxx, P[i].d); 45 } 46 sort(P, P+m, cmp); // 处理前应先排序, 47 for(int i = 0; i < m; i++) 48 { 49 int x = found(P[i].u), y = found(P[i].v); 50 if(x != y) // 如果在一个集合,说明已经算过了,就不用算了 51 { 52 f[x] = y; 53 Harsh[P[i].d] += num[x]*num[y]*2; 54 num[y] += num[x]; 55 } 56 } 57 for(int i = 1; i <= maxx; i++) 58 Harsh[i] += Harsh[i-1]; 59 while(q--) 60 { 61 scanf("%d", &s); 62 if(s > maxx) 63 printf("%d\n", Harsh[maxx]); // 注意 64 else 65 printf("%d\n", Harsh[s]); 66 } 67 } 68 return 0; 69 }
标签:
原文地址:http://www.cnblogs.com/Tinamei/p/4815306.html