Dijstra: 使用优先队列
#include<iostream>
#include<queue>
#include<cstring>
#define INF 100000000
using namespace std;
int map[1005][1005];
int d[1005];
int vis[105];
struct cmp
{
bool operator()(int a,int b)
{
return d[a]>d[b];
}
};
int main()
{
int n,m;
while(cin>>n>>m)
{
if(n==0&&m==0)
break;
int i,j,a,b,c;
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
map[i][j]=INF;
if(i==j)
map[i][j]=0;
}
d[i]=INF;
}
d[1]=0;
for(i=1;i<=m;i++)
{
cin>>a>>b>>c;
map[a][b]=map[b][a]=c;
}
memset(vis,0,sizeof(vis));
priority_queue<int,vector<int>,cmp> q;
q.push(1);
while(!q.empty())
{
int cur=q.top();
q.pop();
if(vis[cur])
continue;
vis[cur]=1;
for(i=1;i<=n;i++)
{
if(!vis[i]&&map[cur][i]<INF&&d[i]>d[cur]+map[cur][i])
{
d[i]=d[cur]+map[cur][i];
q.push(i);
}
}
}
cout<<d[n]<<endl;
}
}
这是AC代码,本来照着算法导论写了一个,总是不能ac 错误在于优先队列排列优先级是在push的时候而不是front的时候,
错误代码:
#include<iostream>
#include<queue>
#define INF 10000000
using namespace std;
int map[105][105];
int d[105];
struct cmp
{
bool operator()(int a,int b)
{
return d[a]<d[b];
}
};
int main()
{
int n,m;
while(cin>>n>>m)
{
if(n==0&&m==0)
break;
int i,j,a,b,c;
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
map[i][j]=INF;
d[i]=INF;
}
d[1]=0;
for(i=1;i<=m;i++)
{
cin>>a>>b>>c;
map[a][b]=map[b][a]=c;
}
priority_queue<int,vector<int>,cmp> q;
for(i=1;i<=n;i++) //这个有问题,,,push之后后面的改变d不会改变优先队列
q.push(i);
while(!q.empty())
{
int cur=q.top();
q.pop();
for(i=1;i<=n;i++)
{
if(map[cur][i]!=INF)
if(d[i]>d[cur]+map[cur][i])
d[i]=d[cur]+map[cur][i];
}
}
cout<<d[n]<<endl;
}
}
还有;Floyd的ac代码:
#include<iostream>
#define INF 10000000
using namespace std;
int map[105][105];
int d[105];
int main()
{
int n,m;
while(cin>>n>>m)
{
if(n==0&&m==0)
break;
int i,j,a,b,c;
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
map[i][j]=INF;
d[i]=INF;
}
d[1]=0;
for(i=1;i<=m;i++)
{
cin>>a>>b>>c;
map[a][b]=map[b][a]=c;
}
int k;
for(i=1;i<=n-1;i++)
{
for(j=1;j<=n;j++)
{
for(k=1;k<=n;k++)
{
if(map[j][k]!=INF)
{
if(d[j]>d[k]+map[j][k])
d[j]=d[k]+map[j][k];
}
}
}
}
cout<<d[n]<<endl;
}
}