您的位置:首页 > 其它

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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: