标签:
dijkstra算法模板:
Int visited[i]//结点i若被访问则为1,没有则为0
Int dist[i]// 目前结点j到其他各结点的最短路的长度
Int w[i][j]//边(i,j)的权值
初始化:(结点1~n)
memset(v,0,sizeof(v));
dist[j]=0;
dist[i]=inf;(i>=1&&i<=n&&i!=j)
cin>>a>>b>>x;
if(w[a][b]>x)//a到b可能有多条路径
w[b][a]=w[a][b]=x;
w[x][y]=inf;边(x,y)不存在
for(i=1;i<=n;i++)
{
int x,m=inf;
for(j=1;j<=n;j++)
if(!visited[j]&&dist[j]<m)
{
m=dist[j];
x=j;
}
visited[x]=1;
for(j=1;j<=n;j++)
If(!visited[j])
dist[j]=min(dist[j],dist[x]+w[x][j])
}Description
Input
Output
Sample Input
3 10 4 1 4 7 5 6 3 3 7 5 2 9 8 10 13 8 12 14 11 11 15 13 16 18 5 17 19 6 8 20 9 1 2 3 10 5 5 1 4 5 3 6 10 5 8 20 2 9 1 7 10 2 1 2 3 4 5 4 4 1 5 1 2 7 20 2 7 3 7 9 4 1 2 3 4
Sample Output
7 -1 12 24 5 15 35 6 8 1 21 4 8
把点的权值转化为通向它的边的权值
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<string>
#include<algorithm>
#define LL long long
#define inf 0x3f3f3f3f
using namespace std;
struct node
{
int l,r;
int w;
}q[2010];
bool visited[2010];
int dist[2010];
int wx[2010][2010];
int main()
{
int T;
cin>>T;
while(T--)
{
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++)
scanf("%d%d%d",&q[i].l,&q[i].r,&q[i].w);
memset(wx,inf,sizeof(wx));
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(i==j) wx[i][j]=wx[j][i]=0;
for(int i=2;i<=n;i++)
for(int j=1;j<=i-1;j++)
if(q[j].r>=q[i].l)
wx[j][i]=q[i].w;
memset(visited,0,sizeof(visited));
memset(dist,inf,sizeof(dist));
dist[1]=0;
for(int i=1;i<=n;i++)
{
int x,mx=inf;
for(int j=1;j<=n;j++)
if(!visited[j]&&dist[j]<mx)
{
mx=dist[j];
x=j;
}
visited[x]=1;
for(int j=1;j<=n;j++)
dist[j]=min(dist[j],dist[x]+wx[x][j]);
}
while(m--)
{
int b;
cin>>b;
if(dist[b]==inf)
cout<<-1<<endl;
else
cout<<dist[b]+q[1].w<<endl;
}
}
return 0;
}
标签:
原文地址:http://blog.csdn.net/winycg/article/details/51356059