题意:给出任意两个村庄间修路的成本,以及是否修好了路,求任意两个村庄都连通的建路最小成本。
解题思路:这道题乍一看和前面几个差不多,仔细一想,真的和前面那个题差不多,只是 把距离变成了成本,又多加了一个状态,首先想到的是能不能用上一题的算法,唯一的问题就是多了一个状态,只要把状态统一,那不就可以了吗,于是就想到了,只要状态是1的,把它们的成本都换成0,这样就和上一题一样了,然后,提交,超时,好吧,把输入换成c语言的输入,总算好了,总体来说,转化完还是很简单的
感想:换个思路,有时候事情真的变简单了
源码:
#include<iostream>
#include<stdio.h>
using namespace std;
const int N=110;
const int INF=0x3f3f3f3f;
int n,ans;
int imap[N][N],dis[N],vis[N];
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,tmp;
for(i=1;i<=n;i++){
tmp=INF;
for(j=1;j<=n;j++)
if(!vis[j] && tmp>dis[j]){
k=j;
tmp=dis[j];
}
if(tmp==INF)
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 num1,num2,temp,state;
for(int i=0;i<n*(n-1)/2;i++)
{
scanf("%d %d",&num1,&num2);
scanf("%d",&temp);
scanf("%d",&state);
if(state){
imap[num1][num2]=0;
imap[num2][num1]=0;
}
else
{
imap[num1][num2]=temp;
imap[num2][num1]=temp;
}
}
ans=0;
Prim();
cout<<ans<<endl;
}
return 0;
}
Problem E
Time Limit : 2000/1000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other)
Total Submission(s) : 72 Accepted Submission(s) : 21
3 1 2 1 0 1 3 2 0 2 3 4 0 3 1 2 1 0 1 3 2 0 2 3 4 1 3 1 2 1 0 1 3 2 1 2 3 4 1 0
3 1 0