BitComet 旗下网站

转到日志
相关贴吧:
acm of zju

zju2966 查找最短路径 但不是用最短路径算法

楼主 发表于:2008-09-08 20:13:50 [回复]

/*Build The Electric System   查找最短路径 
2008-09-08 19:59:18 Accepted 2966 C++ 00:00.10 2304K 天将降大任于我
先按照权值从小到大排序,将最小的权值的那边的两个端点标记为-1已经走过,然后寻找两个端点一个端点已经走过,另一个还没有走过的边
把权值加进来(因为已经排序过,故可从最小权值的点开始,将没走过的点拉进来)
There will be at most one line between any two villages,因为每两个最多只有一条边,故无须考虑两端点有多边连接的情况
*/
#include<iostream>
using namespace std;
const int N=125000;
int a[N+1],b[N+1],k[N+1];
int v[501];
void sort1(int e)
{
 int i,j,temp;
 for(i=0;i<e;i++)
  for(j=i+1;j<e;j++)
   if(k[i]>k[j])
   {
    temp=a[i],a[i]=a[j],a[j]=temp;
                temp=b[i],b[i]=b[j],b[j]=temp;
    temp=k[i],k[i]=k[j],k[j]=temp;
   }
  
}
int main()
{

 int n,p,e,i,j;
 scanf("%d",&n);
 while(n--)
 {
  scanf("%d%d",&p,&e);
  for(i=0;i<e;i++)
   scanf("%d%d%d",&a[i],&b[i],&k[i]);
  sort1(e);
  memset(v,0,sizeof(v));
  v[a[0]]=-1;v[b[0]]=-1;
  int sum=k[0];
  for(i=1;i<p;i++)
  {
   for(j=1;j<e;j++)
    if((v[a[j]]!=-1&&v[b[j]]==-1)||(v[a[j]]==-1&&v[b[j]]!=-1))
    {
     sum+=k[j];
     v[a[j]]=-1;
     v[b[j]]=-1;
     break;
    }
  }
  printf("%d\n",sum);
 }
 return 0;
}

 


心难泰,世风坏,旧时正气今何在?正义寡,人情薄,闻道虽多,茅塞不开。怪!怪!怪! 空等待,几多载,冲出重围人心快!暴雨打,狂风袭,任他折磨,此志难改。耐!耐!耐!

 

您现在还没有登录,请在登录后发贴