Jungle Roads
题目:http://acm.hust.edu.cn/vjudge/contest/123674#problem/F
题意 有n个村子 输入n 然后n-1行先输入村子的序号和与该村子相连的村子数t 后面依次输入t组s和tt s为村子序号 tt为与当前村子的距离 求链接所有村子的最短路径
思路:求最小生成树,得到一条加一条,知道全部联通。
代码如下:
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
int map[10000][10000],d[10000],n,maxx=100000,sum,vis[1000];
int dijkstra(int n)
{
int i,j,p,minc;
sum=0;
memset(vis,0,sizeof(vis));
vis[0]=1;
for(i=1;i<n;i++) d[i]=map[0][i];
for(i=1;i<n;i++)
{
minc=maxx;
p=-1;
for(j=0;j<n;j++)
if(vis[j]==0&&minc>d[j])//找到最小的边作为最小生成树的边
{
minc=d[j];
p=j;
}
if(minc==maxx)return -1;
sum+=minc;//找到一个加一个
vis[p]=1;
for(j=0;j<n;j++)
if(vis[j]==0&&d[j]>map[p][j])//不断更新数组,保留较小的值
d[j]=map[p][j];
}
return sum;
}
int main()
{
int i,j,n;
int t,v;
char a,b;
while(scanf("%d",&n)&&n)
{
sum=0;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
if(i==j) map[i][j]=0;
else map[i][j]=maxx;
}
for(i=1;i<n;i++)
{
cin>>a>>t;
while(t--)
{
cin>>b>>v;
map[a-'A'][b-'A']=v;
map[b-'A'][a-'A']=v;
}
}
printf("%d