zoj 2326 || poj 2075 Tangled in Cables(MST)

很水的最小生成树。

 

给你两个城市之间的道路(无向图),求出需要的电缆。如果大于所提供的,就输出Not enough 。。。 否则输出所需要的电缆长度。

 

Prim。。。这题没有说城市数目。。。210SF 310AC了。。。估计就这两者之间吧。

 

如果数据量大点,是要优化的,可以用字典树查找城市名字。

 

#include <stdio.h> #include <stdlib.h> #include <iostream> #include <string.h> #define INF 9999999.0 #define MAX 310 using namespace std; char town[MAX][25]; double map[MAX][MAX]; int n; double Prim() { double dis[MAX],min,ans; int used[MAX],i,k,now; for(i=1; i<=n; i++) dis[i] = INF; memset(used,0,sizeof(used)); now = 1; used[now] = 1; dis[now] = 0; for(i=1; i<=n; i++) { for(k=1; k<=n; k++) if( !used[k] && dis[k] > map[now][k] ) dis[k] = map[now][k]; min = INF; for(k=1; k<=n; k++) if( dis[k] < min && !used[k] ) min = dis[now = k]; used[now] = 1; } ans = 0; for(i=1; i<=n; i++) if( dis[i] != INF ) ans += dis[i]; else return -1; return ans; } int main() { char a[25],b[25]; double cabs,len,ans; int i,m,aa,bb,k; scanf("%lf%d",&cabs,&n); for(i=1; i<=n; i++) for(k=1; k<=n; k++) map[i][k] = INF; for(i=1; i<=n; i++) scanf("%s",town[i]); scanf("%d",&m); while( m-- ) { scanf("%s%s%lf",a,b,&len); aa = bb = 0; for(i=1; i<=n; i++) { if( aa && bb ) break; if( strcmp(a,town[i]) == 0 ) aa = i; if( strcmp(b,town[i]) == 0 ) bb = i; } map[aa][bb] = map[bb][aa] = len; } ans = Prim(); if( ans == -1 || ans > cabs ) printf("Not enough cable/n"); else printf("Need %.1lf miles of cable/n",ans); return 0; }  

你可能感兴趣的:(优化)