专题四 · 1005

代码及解释

#include <iostream>
#include <stdio.h>
#include <string.h>

//
// 连续两次莫名 AC,结果发现各种脑残手误
// 变量忘记初始化就使用
// 这个特别坑的地方调试了好几次才发现……

int n,ans;

int imap[110][110],dis[110],vis[110];
inline void Prim() {
  int i;

  for(i = 1;i <= n; ++i) {
    dis[i] = imap[1][i];
    vis[i] = 0;
  }

  dis[1] = 0;
  vis[1] = 1;

  int j, k = 0, tmp;
  for(i = 1; i <= n; ++i) {
    tmp = 0x3f3f3f3f;
    for(j = 1; j <= n; ++j)
      if(!vis[j] && tmp > dis[j]) {
        k = j;
        tmp = dis[j];
      }

    if(tmp == 0x3f3f3f3f)
      break;

    vis[k] = 1;
    ans += dis[k];
    for(j = 1; j <= n; ++j)
      if(!vis[j] && dis[j] > imap[k][j])
        dis[j] = imap[k][j];
  }

}

int main(){
  while(~scanf("%d", &n) && n) {
    int ii, jj, temp1, temp2;
    for(int i = 0;i < n * (n - 1) / 2; ++i) {
      scanf("%d %d", &ii, &jj);
      scanf("%d", &temp1);
      scanf("%d", &temp2);
      if(temp2) {
        imap[ii][jj] = imap[jj][ii] = 0;
      } else {
        imap[ii][jj] = imap[jj][ii] = temp1;
      }
    }

    ans = 0;
    Prim();
    printf("%d\n", ans);
  }

  return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值