【Prim】-LightOJ-1029-Civil and Evil Engineer

来源:互联网 发布:淘宝运营教程百度网盘 编辑:程序博客网 时间:2024/06/10 00:15

题目链接:http://lightoj.com/volume_showproblem.php?problem=1029

题目描述:输出最短路和最长路的平均值

解题思路:两遍最短路,注意别忘了打Case数。注意完全反过来的最长路写法。注意比赛时的心理素质

AC代码:

#include <iostream>#include <cstdio>#include <cstring>#define INF 9999999using namespace std;typedef struct node{    int maxw,minw;};int N;node cost[120][120];bool vis[120];int dis[120];void reset(){    memset(cost,0,sizeof(cost));    int i,j;    for(i=0;i<120;i++)        for(j=0;j<120;j++)        {            cost[i][j].minw=INF;            cost[i][j].maxw=-1;        }}int primmin(){    memset(vis,0,sizeof(vis));    for(int i=0;i<120;i++)        dis[i]=INF;    int ans=0,st=0,i;    vis[st]=1;    while(1)    {        for(i=0;i<=N;i++)        {            dis[i]=min(dis[i],cost[st][i].minw);        }        int mindis=INF;        for(i=0;i<=N;i++)        {            if(dis[i]<mindis&&!vis[i])            {                mindis=dis[i];                st=i;            }        }        if(mindis==INF)break;        ans+=mindis;        vis[st]=1;    }    return ans;}int primmax(){    memset(vis,0,sizeof(vis));    for(int i=0;i<120;i++)        dis[i]=-1;    int ans=0,st=0,i;    vis[st]=1;    while(1)    {        for(i=0;i<=N;i++)        {            dis[i]=max(dis[i],cost[st][i].maxw);        }        int maxdis=-1;        for(i=0;i<=N;i++)        {            if(dis[i]>maxdis&&!vis[i])            {                maxdis=dis[i];                st=i;            }        }        if(maxdis==-1)break;        ans+=maxdis;        vis[st]=1;    }    return ans;}int main(){    int T,u,v,w,i,j,ansmin,ansmax,cc=1;    cin>>T;    while(T--)    {        reset();        cin>>N;        ansmax=0;        while(scanf("%d%d%d",&u,&v,&w),u||v||w)        {            cost[u][v].maxw=cost[v][u].maxw=max(cost[u][v].maxw,w);            cost[u][v].minw=cost[v][u].minw=min(cost[u][v].minw,w);        }        ansmin=primmin();        ansmax=primmax();        cout<<"Case "<<cc<<": ";        int ans=ansmin+ansmax;        if(ans%2==0)            cout<<ans/2<<endl;        else            cout<<ans<<"/2"<<endl;        cc++;    }    return 0;}

0 0
原创粉丝点击