九度-1024
# 题目描述: #
省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可)。经过调查评估,得到的统计表中列出了有可能建设公路的若干条道路的成本。现请你编写程序,计算出全省畅通需要的最低成本。
# 输入: #
测试输入包含若干测试用例。每个测试用例的第1行给出评估的道路条数 N、村庄数目M (N, M < =100 );随后的 N 行对应村庄间道路的成本,每行给出一对正整数,分别是两个村庄的编号,以及此两村庄间道路的成本(也是正整数)。为简单起见,村庄从1到M编号。当N为0时,全部输入结束,相应的结果不要输出。
# 输出: #
对每个测试用例,在1行里输出全省畅通需要的最低成本。若统计数据不足以保证畅通,则输出“?”。
# 样例输入: #
3 3
1 2 1
1 3 2
2 3 4
1 3
2 3 2
0 100
# 样例输出: #
3
?
# 代码 #
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#define INF 100000001
using namespace std;
int a[1001];
struct lx
{
int x,y,c;
}l[5001];
int intset(int n)
{
for(int i=0; i<=n; i++)
a[i]=i;
}
int fa(int x)
{
if(x!=a[x])
x=fa(a[x]);
return a[x];
}
bool cmpa(lx t1,lx t2)
{
return t1.c<t2.c;
}
int main()
{
int n,m;
while(scanf("%d%d",&n,&m),n)
{
for(int i=0;i<n;i++)
scanf("%d%d%d",&l[i].x,&l[i].y,&l[i].c);
int x,y;
intset(m);
sort(l,l+n,cmpa);
int ans=0;
for(int i=0;i<n;i++)
{
x=fa(l[i].x);
y=fa(l[i].y);
if(x!=y)
{
ans+=l[i].c;
a[y]=x;
}
}
int s=0;
for(int i=1;i<=m;i++)
if(a[i]==i)s++;
if(s>1)puts("?");
else
printf("%d\n",ans);
}
}
# 作者提醒 #
还是最小生成树。
就是加一个状态检查,能否连接所有的点。
九度-1026
# 题目描述: #
输入两个不超过整型定义的非负10进制整数A和B(<=231-1),输出A+B的m (1 < m <10)进制数。
# 输入: #
输入格式:测试输入包含若干测试用例。每个测试用例占一行,给出m和A,B的值。
当m为0时输入结束。
# 输出: #
输出格式:每个测试用例的输出占一行,输出A+B的m进制数。
# 样例输入: #
8 1300 48
2 1 7
0
# 样例输出: #
2504
1000
# 代码: #
#include <iostream>
#include <stack>
using namespace std;
int main(){
int m; //表示m进制数字
unsigned int A,B;
stack<int>s;
while(cin>>m){
if(m == 0)
break;
while(!s.empty())
s.pop();
cin>>A>>B;
long long temp = A + B;
while(temp >= m){
long long result = temp % m;
temp = temp / m;
s.push(result);
}
s.push(temp);
while(!s.empty()){
cout<<s.top();
s.pop();
}
cout<<endl;
}
return 0;
}
# 作者提醒 #
这道题目的关键是数据的表示问题,
因为A,B的大小问题,如果设置成int型会通不过,因为在运算A+B的时候,会溢出。
所以定义A,B时,用unsigned或者 long long。 本题中,根据进制与数字的关系,
用栈最能体现这种关系。当然用数组来保存每位数字,或者直接在每次得到余数之后输出也是可以的。
最后注意格式,要在输出数字之后换行。