畅通工程Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 42808 Accepted Submission(s): 19128 Problem Description 省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可)。经过调查评估,得到的统计表中列出了有可能建设公路的若干条道路的成本。现请你编写程序,计算出全省畅通需要的最低成本。
Input 测试输入包含若干测试用例。每个测试用例的第1行给出评估的道路条数 N、村庄数目M ( < 100 );随后的 N
Output 对每个测试用例,在1行里输出全省畅通需要的最低成本。若统计数据不足以保证畅通,则输出“?”。
Sample Input 3 3 1 2 1 1 3 2 2 3 4 1 3 2 3 2 0 100
Sample Output 3 ? |
Kruskal:
#include<iostream>
#include<algorithm>
#define N 101
using namespace std;
int pre[N],n,m;
struct node
{
int x,y,w;
}edge[10001];
int find(int x)
{
int p=x,temp;
while(x!=pre[x])
x=pre[x];
while(p!=x)
{
temp=pre[p];
pre[p]=x;
p=temp;
}
return x;
}
void merge(int x,int y)
{
x=find(x);
y=find(y);
if(x!=y)
pre[y]=x;
}
int cmp(node a,node b)
{
return a.w<b.w;
}
int kruskal(int n)
{
int ans=0;
sort(edge,edge+n,cmp);
for(int i=0;i<n;i++)
{
int a=edge[i].x;
int b=edge[i].y;
if(find(a)!=find(b))
{
ans+=edge[i].w;
merge(a,b);
}
}
return ans;
}
int main()
{
while(cin>>n>>m&&n>0)
{
int k=0;
for(int i=1;i<=m;i++)
{
pre[i]=i;
}
for(int i=0;i<n;i++)
{
cin>>edge[i].x>>edge[i].y>>edge[i].w;
}
int sum=kruskal(n);
int flag=1;
for(int i=2;i<=m;i++)
{
if(find(1)!=find(i))
flag=0;
}
if(flag)
cout<<sum<<endl;
else
cout<<"?"<<endl;
}
return 0;
}
Prim:
#include<iostream>
#include<cstring>
#define N 101
#define inf 0x3f3f3f3f
using namespace std;
int vis[N],dis[N],map[N][N];
int n,m;
int prim(int m,int n)
{
memset(dis,inf,sizeof(dis));
for(int j=0;j<n;j++)
{
int t=inf,pos;
dis[1]=0;
for(int i=1;i<=m;i++)
{
if(dis[i]<t&&!vis[i])
{
t=dis[i];
pos=i;
}
vis[pos]=1;
for(int i=1;i<=m;i++)
{
if(!vis[i]&&dis[i]>map[pos][i]&&map[pos][i]!=inf)
{
dis[i]=map[pos][i];
}
}
}
}
int ans=0;
for(int i=1;i<=m;i++)
{
ans+=dis[i];
}
return ans;
}
int main()
{
while(cin>>n>>m&&n>0)
{
memset(map,inf,sizeof(map));
memset(vis,0,sizeof(vis));
for(int i=0;i<n;i++)
{
int x,y,w;
cin>>x>>y>>w;
map[x][y]=w;
map[y][x]=w;
}
int sum=prim(m,n);
int flag=1;
for(int i=1;i<=m;i++)
{
if(vis[i]==0)
flag=0;
}
if(flag)
cout<<sum<<endl;
else
cout<<"?"<<endl;
}
return 0;
}