热浪洛谷oj1339
题目描述 Description
FJ已经研究过可以把牛奶从威斯康星运送到德克萨斯州的路线。这些路线包括起始点和终点先一共经过T (1 <= T <= 2,500)个城镇,方便地标号為1到T。除了起点和终点外地每个城镇由两条双向道路连向至少两个其它地城镇。每条道路有一个通过费用(包括油费,过路费等等)。
给定一个地图,包含C (1 <= C <= 6,200)条直接连接2个城镇的道路。每条道路由道路的起点Rs,终点Re (1 <= Rs <= T; 1 <= Re <= T),和花费(1 <= Ci <= 1,000)组成。求从起始的城镇Ts (1 <= Ts <= T)到终点的城镇Te(1 <= Te <= T)最小的总费用。
第2到第C+1行: 第i+1行描述第i条道路。有3个由空格隔开的整数: Rs, Re和Ci 输出格式: 一个单独的整数表示从Ts到Te的最小总费用。数据保证至少存在一条道路。
5->6->1->4 (3 + 1 + 3)
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#include<vector>
using namespace std;
#define rep(i,n) for(int i=0;i<n;i++)
#define clr(x,c) memset(x,c,sizeof(x))
#define adde(u,v,d) add(u,v,d),add(v,u,d)
const int nmax=2510;
const int maxn=6205<<1;
const int inf=0x3f3f3f3f;
struct edge{
int to,dist;
edge*next;
};
edge edges[maxn],*pt,*head[nmax];
int d[nmax],v[nmax];
void add(int u,int v,int d){
pt->to=v;
pt->dist=d;
pt->next=head[u];
head[u]=pt++;
}
int main(){
int n,m,i,j,k,l,s,t;
cin>>n>>m>>s>>t;
pt=edges;
clr(head,0);
rep(i,m){
cin>>j>>k>>l;
adde(j,k,l);
}
queue<int>q;
q.push(s);
clr(v,0);
rep(i,n+1) d[i]=inf;
v[s]=0;
d[s]=0;
while(!q.empty()){
int u=q.front();
q.pop();
v[u]=0;
for(edge*o=head[u];o;o=o->next){
int to=o->to;int di=o->dist;
if(d[to]>d[u]+di){
d[to]=d[u]+di;
if(!v[to]){
q.push(to);
v[to]=1;
}
}
}
}
cout<<d[t]<<endl;
return 0;
}
dijkstra
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#include<vector>
#include<cmath>
using namespace std;
#define rep(i,n) for(int i=0;i<n;i++)
#define clr(x,c) memset(x,c,sizeof(x))
#define adde(u,v,d) add(u,v,d),add(v,u,d)
const int nmax=2505;
const int maxn=6205<<1;
const int inf=0x3f3f3f3f;
struct edge{
int to,dist;
edge *next;
};
edge*head[nmax],*pt,edges[nmax];
int d[nmax];
void add(int u,int v,int d){
pt->to=v;
pt->dist=d;
pt->next=head[u];
head[u]=pt++;
}
struct node{
int x,d;
bool operator<(const node&rhs)const{
return d>rhs.d;}
};
int main(){
int n,m,i,j,k,l,s,t;
cin>>n>>m>>s>>t;
!!!!!!!!!pt=edges;!!!!!不用v数组来记录!!!和spfa的两个不同之处!!!!!
clr(head,0);
rep(i,m){
cin>>j>>k>>l;
adde(j,k,l);
}
rep(i,n+1) d[i]=inf;
d[s]=0;
priority_queue<node>q;
q.push((node){s,0});
while(!q.empty())
{
int x=q.top().x;
int di=q.top().d;
q.pop();
for(edge* o=head[x];o;o=o->next){
int to=o->to;
int dist=o->dist;
if(d[to]>di+dist){
d[to]=di+dist;
q.push((node){to,d[to]});
}
}
}
cout<<d[t]<<endl;
return 0;
}