您的位置:首页 > 其它

Problem F

2016-06-21 09:56 393 查看
简单题意

给出村庄(编号用字母表示)与其他村庄之间道路的维护费用(村庄不一定和其他村庄有直接相连的道路),选择适当的道路进行维护,使得所有村庄都能通过被维护的道路连通而且维护费用最少。

解题思路形成过程

又是求最少(小)的问题,还是换汤不换药,重用Problem D的代码,不就是把村庄序号改成字母了嘛,用ASCII码转换成数字,对于“村庄不一定和其他村庄有直接相连的道路”

没有直接道路相连的村庄,假设有一条路只不过维护费用无穷大。改完这些代码顺利AC

感想

前六道题一个代码用了5遍,总感觉是在耍小聪明


AC代码

#include <iostream>

#include <fstream>

#include <string.h>

using namespace std;

int n;

int Min[110];

int visit[110];

int dis[110][110];

void solve(){

    memset(visit,0,sizeof(visit));

    int x=1;

    visit[1]=1;

    int sum=0;

    for(int i=2;i<=n;i++)

        Min[i]=dis[1][i];

    for(int i=1;i<n;i++){

        int temp=10000000;

        for(int j=1;j<=n;j++)

        if(!visit[j]&&temp>Min[j]){

            temp=Min[j];

            x=j;

        }

        sum+=temp;

        visit[x]=1;

        for(int j=1;j<=n;j++)

            if(!visit[j]&&dis[j][x]<Min[j])

              Min[j]=dis[j][x];

    }

    cout<<sum<<endl;

}

int main()

{

    ifstream cin("in.txt");

    char c;

    int m,p;

    while(cin>>n&&n){

        memset(dis,0x3f,sizeof(dis));

        for(int i=1;i<=n-1;i++){

           cin>>c>>m;

           for(int j=1;j<=m;j++){

               cin>>c>>p;

               int temp=int(c-'A')+1;

               dis[i][temp]=dis[temp][i]=p;

           }

        }

        solve();

    }

    return 0;

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