第一种是prim算法
但是有点坑
#include<iostream>
using namespace std;
typedef long long ll;
ll arc[1010][1010];
const ll inf=0x3f3f3f3f;
int n,e;
ll prim()
{
ll dist[1010];
ll curent;
ll sum=0;
int i,j,k;
dist[1]=0;
for(i=2;i<=n;i++)
{
dist[i]=arc[1][i];
}
for(i=0;i<n-1;i++)
{
curent=inf;
for(j=2;j<=n;j++)
{
if(dist[j]!=0&&dist[j]<curent)
{
curent=dist[j];
k=j;
}
}
sum+=curent;
dist[k]=0;
for(j=2;j<=n;j++)
{
if(dist[j]!=0&&dist[j]>arc[k][j])
dist[j]=arc[k][j];
}
}
return sum;
}
int main()
{
cin>>n>>e;
int i,j;
int a,b,c;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
arc[i][j]=inf;
for(i=0;i<e;i++)
{
cin>>a>>b>>c;
arc[a][b]=c;
arc[b][a]=c;
}
cout<<prim()<<endl;
return 0;
}
2U 2018/8/15 11:54:51
你以为这样就对了?
还是太年起了吧!
其实应该是题目给的条件有问题
它说ci>=1的
其实不然 测试数据中ci其实是有可能为0的
所以说 dist被走过了就要赋值为-1 而不是0哦哦!!!!!
#include<iostream>
using namespace std;
typedef long long ll;
ll arc[1010][1010];
const ll inf=0x3f3f3f3f;
int n,e;
ll prim()
{
ll dist[1010];
ll curent;
ll sum=0;
int i,j,k;
dist[1]=-1;
for(i=2;i<=n;i++)
{
dist[i]=arc[1][i];
}
for(i=0;i<n-1;i++)
{
curent=inf;
for(j=2;j<=n;j++)
{
if(dist[j]!=-1&&dist[j]<curent)
{
curent=dist[j];
k=j;
}
}
sum+=curent;
dist[k]=-1;
for(j=2;j<=n;j++)
{
if(dist[j]!=-1&&dist[j]>arc[k][j])
dist[j]=arc[k][j];
}
}
return sum;
}
int main()
{
cin>>n>>e;
int i,j;
int a,b,c;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
arc[i][j]=inf;
for(i=0;i<e;i++)
{
cin>>a>>b>>c;
arc[a][b]=c;
arc[b][a]=c;
}
cout<<prim()<<endl;
return 0;
}
2U 2018/8/15 11:54:51
第二种就是Dijkstra算法
可以用一个优先队列
#include<iostream>
#include<queue>
using namespace std;
int n,e;
struct Node
{
int from;
int to;
int w;
friend bool operator <(Node a,Node b)
{
return a.w>b.w;
}
};
priority_queue<Node> q;
int parent[1010];
int findroot(int x)
{
if(parent[x]==-1)
return x;
else return findroot(parent[x]);
}
int change(int from,int to)
{
int x,y;
x=findroot(from);
y=findroot(to);
if(x!=y)
{
parent[x]=y;
return 1;
}
else return 0;
}
int Dijkstra()
{
Node t;
int sum=0;
int number=0;
while(1)
{
if(number==n-1)
break;
t=q.top();
q.pop();
int from,to;
from=t.from;
to=t.to;
if(change(from,to))
{
sum+=t.w;
number++;
}
}
return sum;
}
int main()
{
cin>>n>>e;
int i;
int a,b,c;
Node t;
for(i=0;i<e;i++)
{
cin>>a>>b>>c;
t.from=a;
t.to=b;
t.w=c;
q.push(t);
}
for(i=1;i<=n;i++)
parent[i]=-1;
cout<<Dijkstra()<<endl;
return 0;
}
虽然是模板题还是要小心呀!