hdu 1879(继续畅通工程)
2013-04-25 20:10
387 查看
很直接的最小生成树。只需要把连通的距离置为0即可。。。
#include <iostream>
using namespace std;
#define MAX 10000000
int g[110][110];
int dist[110];
int vis[110];
int main()
{
int n;
while(scanf("%d",&n)==1&&n)
{
for(int i=0;i<=n;i++)
for(int j=0;j<=n;j++)
g[i][j]=MAX;
for(int i=0;i<(n*(n-1))/2;i++)
{
int a,b,c,d;
scanf("%d %d %d %d",&a,&b,&c,&d);
if(d)
g[a][b]=g[b][a]=0;
else if(c<g[a][b])
g[a][b]=g[b][a]=c;
}
for(int i=1;i<=n;i++)
{
dist[i]=g[1][i];
vis[i]=0;
}
vis[1]=1;
dist[1]=0;
for(int i=2;i<=n;i++)
{
int p,tmp=MAX;
for(int j=1;j<=n;j++)
if(!vis[j]&&tmp>dist[j])
{
p=j;
tmp=dist[j];
}
vis[p]=1;
for(int j=1;j<=n;j++)
if(!vis[j]&&dist[j]>g[p][j])
dist[j]=g[p][j];
}
int sum=0;
for(int i=1;i<=n;i++)
sum+=dist[i];
printf("%d\n",sum);
}
return 0;
}
#include <iostream>
using namespace std;
#define MAX 10000000
int g[110][110];
int dist[110];
int vis[110];
int main()
{
int n;
while(scanf("%d",&n)==1&&n)
{
for(int i=0;i<=n;i++)
for(int j=0;j<=n;j++)
g[i][j]=MAX;
for(int i=0;i<(n*(n-1))/2;i++)
{
int a,b,c,d;
scanf("%d %d %d %d",&a,&b,&c,&d);
if(d)
g[a][b]=g[b][a]=0;
else if(c<g[a][b])
g[a][b]=g[b][a]=c;
}
for(int i=1;i<=n;i++)
{
dist[i]=g[1][i];
vis[i]=0;
}
vis[1]=1;
dist[1]=0;
for(int i=2;i<=n;i++)
{
int p,tmp=MAX;
for(int j=1;j<=n;j++)
if(!vis[j]&&tmp>dist[j])
{
p=j;
tmp=dist[j];
}
vis[p]=1;
for(int j=1;j<=n;j++)
if(!vis[j]&&dist[j]>g[p][j])
dist[j]=g[p][j];
}
int sum=0;
for(int i=1;i<=n;i++)
sum+=dist[i];
printf("%d\n",sum);
}
return 0;
}
相关文章推荐
- 继续畅通工程 HDU - 1879
- HDU 1879 继续畅通工程
- hdu 1879 继续畅通工程 最小生成树
- hdu 1879 继续畅通工程 最小生成树
- hdu 1879 继续畅通工程
- HDU 1879继续畅通工程(并查集)
- HDU - 1879 继续畅通工程(最小生成树)
- HDU 1879 继续畅通工程
- hdu1879 继续畅通工程(最小生成树、 并查集)
- [HDU] 1879 继续畅通工程
- hdu_1879 继续畅通工程
- HDU 1879 继续畅通工程——最小生成树
- hdu_1879_继续畅通工程_kruscal_prim_再续
- HDU 1879 继续畅通工程(九度OJ 1028)
- hdu 1879 继续畅通工程
- hdu 1879 继续畅通工程
- HDU 1879 继续畅通工程【Prim】
- hdu 1879 继续畅通工程
- HDU 1879--继续畅通工程【kruskal && 最小生成树 && 水题】
- hdu 1879 继续畅通工程