POJ 2075 Tangled in Cables
2008-11-20 14:14
239 查看
这个又是一个Prim算法的典型应用,具体在此题目的时候要注意,数组要开得适当大,无向图在邻接矩阵中要置为对称。
#include<iostream>
#include<cstdio>
#include<vector>
#include<string>
using namespace std;
const int MAX = 15000;
const double INF = 100000000;
string owner[MAX];
double c[MAX][MAX];
bool flag[MAX];
vector<int> U_Set;
double Prim(int n)
{
double ans = 0;
U_Set.push_back(1);
flag[1] = true;
for(int i = 1; i < n; i++)
{
int start = 1;
int k = 1;
int end = 1;
double min = INF;
int U_len = U_Set.size();
for(int p=0;p<U_len;p++) {
start = U_Set[p];//每次取出U集合中一个点,与不是U集合中的点比较,取路程最小的一个
for(k=1;k<=n;k++)
{
if(start!=k&&c[start][k]<min &&!flag[k])
{
min = c[start][k];
end = k;
}
}
}
//找到那个点以后,flag置为true
flag[end] = true;
U_Set.push_back(end);
//边为start----end
//把这两个点之间的长度 add ans
ans += min;
}
return ans;
}
int getPos(int n,string s) {
for(int i=1;i<=n;i++) {
if(owner[i]==s)
return i;
}
return 0;
}
int main() {
int i, j, n, m;
double cable;
cin>>cable;
cin>>n;
for(int i=1;i<=n;i++) {
cin>>owner[i];
}
//初始化置空
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
if(i==j)
c[i][j]=0;
else
c[i][j]=INF;
}
cin>>m;
for(i = 1;i<= m;i++)
{
string s1,s2;
cin>>s1>>s2;
int a1 = getPos(n,s1);
int b1 = getPos(n,s2);
double c3;
cin>>c3;
//无向图,存储成邻接矩阵,所以要对称地置数
c[a1][b1]=c3;
c[b1][a1]=c3;
}
double result = Prim(n);
if(result>cable)
cout<<"Not enough cable"<<endl;
else
cout<<"Need "<<result<<" miles of cable"<<endl;
return 0;
}
#include<iostream>
#include<cstdio>
#include<vector>
#include<string>
using namespace std;
const int MAX = 15000;
const double INF = 100000000;
string owner[MAX];
double c[MAX][MAX];
bool flag[MAX];
vector<int> U_Set;
double Prim(int n)
{
double ans = 0;
U_Set.push_back(1);
flag[1] = true;
for(int i = 1; i < n; i++)
{
int start = 1;
int k = 1;
int end = 1;
double min = INF;
int U_len = U_Set.size();
for(int p=0;p<U_len;p++) {
start = U_Set[p];//每次取出U集合中一个点,与不是U集合中的点比较,取路程最小的一个
for(k=1;k<=n;k++)
{
if(start!=k&&c[start][k]<min &&!flag[k])
{
min = c[start][k];
end = k;
}
}
}
//找到那个点以后,flag置为true
flag[end] = true;
U_Set.push_back(end);
//边为start----end
//把这两个点之间的长度 add ans
ans += min;
}
return ans;
}
int getPos(int n,string s) {
for(int i=1;i<=n;i++) {
if(owner[i]==s)
return i;
}
return 0;
}
int main() {
int i, j, n, m;
double cable;
cin>>cable;
cin>>n;
for(int i=1;i<=n;i++) {
cin>>owner[i];
}
//初始化置空
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
if(i==j)
c[i][j]=0;
else
c[i][j]=INF;
}
cin>>m;
for(i = 1;i<= m;i++)
{
string s1,s2;
cin>>s1>>s2;
int a1 = getPos(n,s1);
int b1 = getPos(n,s2);
double c3;
cin>>c3;
//无向图,存储成邻接矩阵,所以要对称地置数
c[a1][b1]=c3;
c[b1][a1]=c3;
}
double result = Prim(n);
if(result>cable)
cout<<"Not enough cable"<<endl;
else
cout<<"Need "<<result<<" miles of cable"<<endl;
return 0;
}
相关文章推荐
- poj 2075 Tangled in Cables
- POJ 2075 Tangled in Cables
- poj_2075 Tangled in Cables
- poj 2075 Tangled in Cables
- 2075:Tangled in Cables
- Pku acm 2075 Tangled in Cables数据结构题目解题报告(十一)最小生成树:prim算法&amp;amp;二叉查找树
- Pku acm 2075 Tangled in Cables数据结构题目解题报告(十一)最小生成树:prim算法&amp;amp;二叉查找树
- CUGB图论专场:C - Tangled in Cables(最小生成树kruscal)
- 哈理工acm练习赛 K - Tangled in Cables
- poj 2075 Tangled in Cables【最小生成树+字符串处理】
- ZOJ 2326 Tangled in Cables
- POJ 2075 Tangled in Cables(最小生成树 kruscal)
- POJ2075--Tangled in Cables
- poj 2075 Tangled in Cables
- POJ 2075 Tangled in Cables 最小生成树
- POJ 2075 Tangled in Cables (c++/java)
- POJ 2075 Tangled in Cables 最小生成树
- POJ 2075 Tangled in Cables
- POJ 2075 Tangled in Cables(Kruskal算法)
- POJ 2075 Tangled in Cables (c++/java)