ネットワーキング(プリムアルゴリズム)
広域の特定のポイント間のネットワーク接続を設計するように割り当てられています。エリア内の一連のポイントと、ポイントのペアを接続する可能性のあるケーブルの一連の可能なルートが提供されます。2つのポイント間の可能なルートごとに、そのルートでポイントを接続するために必要なケーブルの長さが与えられます。与えられた2つのポイント間に多くの可能なルートが存在する可能性があることに注意してください。与えられた可能なルートは、エリア内の各2ポイントを(直接的または間接的に)接続すると想定されます。
あなたの仕事は、エリアのネットワークを設計することです。これにより、2つのポイントごとに接続(直接または間接)があり(つまり、すべてのポイントが相互接続されますが、必ずしも直接ケーブルで接続されている必要はありません)、使用するケーブルは最小限です。入力
入力ファイルは、いくつかのデータセットで構成されています。各データセットは、1つの必要なネットワークを定義します。セットの最初の行には2つの整数が含まれています。1つ目は指定されたポイントの数Pを定義し、2つ目はポイント間の指定されたルートの数Rを定義します。次のR線は、ポイント間の指定されたルートを定義し、それぞれが3つの整数を示します。最初の2つの数字はポイントを識別し、3番目はルートの長さを示します。数字は空白で区切られています。1つの数値P = 0のみを与えるデータセットは、入力の終わりを示します。データセットは空の行で区切られます。
ポイントの最大数は50です。特定のルートの最大長は100です。可能なルートの数は無制限です。ノードは、1からP(両端を含む)までの整数で識別されます。2点iとjの間のルートは、ijまたはjiとして指定できます。出力
データセットごとに、設計されたネットワーク全体に使用されるケーブルの全長を示す1つの数字を別々の行に印刷します。
サンプル入力
1 0 2 3 1 2 37 2 1 17 1 2 68 3 7 1 2 19 2 3 11 3 1 7 1 3 5 2 3 89 3 1 91 1 2 32 5 7 1 2 5 2 3 7 2 4 8 4 5 11 3 5 10 1 5 6 4 2 12 0
サンプル出力
0 17 16 26
スポンサー
アイデア:
プリムアルゴリズムによって解決された適切な最小全域木問題
実装コード:
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int inf=0x3f3f3f;
int map[100][100],dis[100],book[100];
int m,n;
int prim()
{
int i,j,k,sum=0,u,min;
for(i=1;i<=n;i++)//循环范围根据题目从1开始 ,这里初始化一下
{
dis[i]=map[1][i];//表示原点到其他点的距离
book[i]=0;
}
book[1]=1;
//dis[1]=0;
for(i=1;i<n;i++)
{
min=inf;
for(j=1;j<=n;j++)
{
if(book[j]==0&&min>dis[j])
{
min=dis[j];
u=j;
}
}
book[u]=1;
sum+=dis[u];
for(j=1;j<=n;j++)
{
if(book[j]==0&&dis[j]>map[u][j])
dis[j]=map[u][j];
}
}
return sum;
}
int main()
{
int a,b,c,i,j,k;
while(scanf("%d",&n),n!=0)
{
memset(map,inf,sizeof(map));//初始化一下
scanf("%d",&m);
for(i=1;i<=m;i++)//输入地图
{
scanf("%d%d%d",&a,&b,&c);
if(map[a][b]>c||map[b][a]>c)
{
map[a][b]=map[b][a]=c;
}
}
printf("%d\n",prim());
}
return 0;
}
注意:
入力に入力された同じ2点間の距離が小さい場合は、入力マップを更新する必要があります
知らない人のために、あなたはこれを最初に見ることができます:https://blog.csdn.net/with_wine/article/details/113972924基礎を築く