HDU:还是畅通工程

来源:互联网 发布:核冬天 知乎 编辑:程序博客网 时间:2024/06/03 10:05

题目地址:

http://acm.hdu.edu.cn/showproblem.php?pid=1233

思路:

最短路径模板题,这里谈一下写最短路径的题目时应该必须注意到的事情,虽然起点是随机选定的,但是由于起点其独特性,必须分开讨论。千万不要,加入循环里面随便讨论。因为这样很不容易说清楚的。

贴上代码:

#include <iostream>#include<cstdio>#include<cstring>using namespace std;#define MAX  105#define INF  9999999int map[MAX][MAX];bool vis[MAX];int dis[MAX];int N;int ans;void Prim(){    int i,j,v,Min;    for(i=1;i<=N;i++)    {        dis[i]=map[1][i];        vis[i]=0;    }    //确定1是起点    dis[1]=0;    vis[1]=1;    ans=0;    //一定要注意起点。    //起点并不包含在循环里面    //分开讨论    for(i=2;i<=N;i++)    {        Min=INF;        for(j=2;j<=N;j++)        {            if(!vis[j]&&dis[j]<Min){                Min=dis[j];                v=j;            }        }        vis[v]=1;        if(Min!=INF)//这一句一一定不能少        ans=ans+Min;        for(j=2;j<=N;j++)        {            if(!vis[j]&&dis[j]>map[v][j])                dis[j]=map[v][j];        }    }    printf("%d\n",ans);    return;}int main(){    int i,j,a,b,c,S;    while(scanf("%d",&N)!=EOF,N)    {      for(i=1;i<=N;i++)      {        map[i][i]=0;      }      S=N*(N-1)/2;     for(i=1;i<=S;i++)     {        scanf("%d%d%d",&a,&b,&c);        map[a][b]=map[b][a]=c;     }     Prim();    }    return 0;}
原创粉丝点击