畅通工程
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 20255 Accepted Submission(s): 8662
行对应村庄间道路的成本,每行给出一对正整数,分别是两个村庄的编号,以及此两村庄间道路的成本(也是正整数)。为简单起见,村庄从1到M编号。当N为0时,全部输入结束,相应的结果不要输出。
3 3 1 2 1 1 3 2 2 3 4 1 3 2 3 2 0 100
3 ?
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int pre[1000];
int find(int x)
{
while(pre[x]!=x) x=pre[x];
return x;
}
int main()
{
int n,m,i,a,b,c,x,y,road,res;
while(scanf("%d %d",&n,&m),n)
{
memset(pre,0,sizeof(pre));
road=m-1; //m个城镇,只需m-1条道路
x=y=res=0;
pair<int,int> pa;
pair< int,pair<int,int> > p[105];
for(i=0;i<n;i++)
{
scanf("%d %d %d",&a,&b,&c);
pa.first=a;
pa.second=b;
p[i]=make_pair(c,pa);
}
sort(p,p+n); //根据费用升序排序
for(i=1;i<=m;i++) pre[i]=i; //初始化
for(i=0;i<m;i++)
{
x=find(p[i].second.first); //找到第一个端点所在集合的序号
y=find(p[i].second.second); //找到第二个端点所在集合的序号
if(x!=y)
{
x=find(x);
y=find(y);
pre[x]=y; //合并
res+=p[i].first; //加上费用
road--;
if(!road) break; //道路数量足够了就跳出循环
}
}
if(!road) printf("%d\n",res);
else printf("?\n");
}
return 0;
}
在这里所以下pair的用法
1.创建和初始化:
pair<string,string> name;
pair< string,vector<int> > data; //注意加空格,我用的编译器是cfree,若不加空格会被认为是“<<”
以上全部调用pair类型的默认构造函对其成员进行数值初始化,成员初始化为空或0值
也能在定义时提供初始化式:
pair<string,int> Mike("Mike Brown",26);
技巧:使用typedef简化声明
typedef pair<string,string> name;
name dotcom("is","programmer");
2.pair对象的操作
pair的两个成员--first和second都是公有的,使用点操作符就可以访问其成员:
string next;
if (name.first == "gem" && name.second == "linux")
next = name.first;
3.生成新的pair对象
make_pair函数可以生成pair对象,例子:
pair<string,string> next_auth;
string first,last;
while (cin >> first >> last){
next_auth = make_pair(first,last);
}
技巧:可以直接用标准输入流读入数据到pair对象中
pair<string,string> next_auth;
while (cin >> next_auth.first >> next_auth.second){...}