HDU1879

来源:互联网 发布:rx1r2 知乎 编辑:程序博客网 时间:2024/06/05 15:50

这道题其实就是在最小生成树上要加一个判断,就是当这条道路修成时,两条道路间的费用是0,只要把这里处理好,这道题就跟普通的最小生成树没有什么区别了

#include<stdio.h>#include<string.h>#include<iostream>#include<cmath>#include<cstdlib>#include<vector>#include<algorithm>#include<vector>#include<queue>#include<set>#define inf 0x7fffffffusing namespace std;#define N 9999999int map[101][101];int mark[101];bool visited[101];int n;int prim(){int i,j,k,sum=0,min;memset(mark,0,sizeof(mark));memset(visited,0,sizeof(visited));k=1;visited[k]=1;for(i=2;i<=n;i++){mark[i]=map[k][i];               //计算k到各顶点的距离}min=N;for(i=1;i<=n-1;i++){for(j=1;j<=n;j++)if(mark[j]<min&&!visited[j]){min=mark[j];k=j;}visited[k]=1;for(j=1;j<=n;j++){if(mark[j]>map[k][j]&&!visited[j])mark[j]=map[k][j];}sum+=min;min=N;}return sum;}int main(){int i,j;int a,b,s,x;while(cin>>n&&n){for(i=1;i<=n;i++)for(j=1;j<=n;j++){if(i==j){map[i][j]=0;}else{map[i][j]=N;}}for(i=1;i<=n*(n-1)/2;i++){scanf("%d%d%d%d",&a,&b,&s,&x);if(x==0){map[a][b]=s;    map[b][a]=s;}else{map[a][b]=0;map[b][a]=0;}}printf("%d\n",prim());}return 0;}


0 0
原创粉丝点击