描述
电科集训已经结束很久,但电科种种味道却让我们久久回味。
LZH对电科校园里的各种气味尤为深刻,这些怪异的气味常常让他的食欲大减。因此不管去哪,他总是希望走“最佳路线”。
LZH把电科所有路径都标记了一个气味值Wi,Wi越小,表示该路径上的气味越为怪异难闻。
所谓的从a地到b地“最佳路线”便是指a地到b地所有可能的路线方案中,W之和最大的那条路线。
注意:当LZH重复经过同一条路径时,该路径上的Wi值只会被计算一次(重边代表不同的路径)。
现在,LZH有Q个浏览校园的计划,他希望你告诉他的每个计划中,“最佳路线”上的W之和是多少
输入
多组测试数据
每组测试数据的第一行有三个整数N,M和Q,分别表示电科由N个顶点,M条无向边组成,并且LZH有Q个计划 (其中 0 < N <= 100 , 0 < M <= 10000 , 0 < Q <= 10000)
接下来的M行,每行有3个整数a,b ,W,表示点a与点b之前有一条直接相连的路径,且路径的“气味值”为W。 (其中 0 < a,b < N 0< W <10000)
接下来的Q行,每行有两个整数u,v ,表示LZH的浏览计划是从点u逛到点v。
输出
输出共有Q行,若无法从u到达 v,则输出No solution
否则,输出“最佳路线”上的W之和
样例输入
6 4 3
1 2 3
2 3 4
3 5 1
4 5 2
1 4
4 1
6 4
样例输出
10
10
No solution
**************************************************************************************************************************************************************************************
题目链接: http://218.194.91.48/acmhome/problemdetail.do?&method=showdetail&id=1078
题目大意是求各棵树(连通图)内所有值的和,因为就算目的地在眼前,苊也可以先去逛两圈(只记录一次)再回来去目的地,只有没在一个连通图才输了No solution。
题目中说了如果有重边则当有多条路(上面红字),所以合并的时候只合并一次但w的值还是要继续加,这个不知道可不可以算个坑!!下次一定不能在一棵树上吊死!
AC代码:
#include<cstdio> #include<algorithm> #include<cstring> using namespace std; int an[110],n,m,Q,Q1,Q2,sum,cnt[110]; void Init(){ int i; for(i=1;i<=n;i++) an[i]=i; } int Find(int x){ while(x!=an[x]) x=an[x]; return x; } void Union(int a,int b,int c){ int ra=Find(a),rb=Find(b); an[rb]=ra; if(ra!=rb) cnt[ra]+=cnt[rb];//当根节点不同时才加,不然要要加多 cnt[ra]+=c;//这个才是每次都要加 } int main(){ int i,d,j,rq,x,y; while(~scanf("%d%d%d",&n,&m,&Q)){ memset(cnt,0,sizeof(cnt)); Init(); for(i=0;i<m;i++){ scanf("%d%d%d",&x,&y,&d); Union(x,y,d); } while(Q--){ scanf("%d%d",&Q1,&Q2); rq=Find(Q1); if(rq!=Find(Q2)) puts("No solution"); else printf("%d\n",cnt[rq]); } } return 0; }