5 5 1 2 20 2 3 30 3 4 20 4 5 20 1 5 100Sample Output
90Hint
题意:求从1到点n的最短路
代码一:79ms
#include
#include
#include
#include
#define Inf 0x3f3f3f3f
using namespace std;
const int N = 1005;
struct node{
int to;
int val;
};
vectorG[N];
int vis[N],dis[N];
int m,n;
void Dijkstra(int s){
memset(vis,0,sizeof(vis));
memset(dis,Inf,sizeof(dis));
dis[s]=0;
for(int k=0;kdis[i]){
mint=dis[i];
u=i;
}
}
vis[u]=1;
for(int i=0;idis[u]+G[u][i].val){
dis[v]=dis[u]+G[u][i].val;
}
}
}
printf("%d\n",dis[n]);
}
int main(){
scanf("%d%d",&m,&n);
for(int i=0;i
代码二:47ms
优先队列优化
#include
#include
#include
#include
#define Inf 0x3f3f3f3f
using namespace std;
const int N = 1005;
struct node{
int to;
int val;
};
struct Node{
int u;
int val;
bool operator < (const Node other) const{
return val>other.val;
}
};
vectorG[N];
int vis[N],dis[N];
int m,n;
void Dijkstra(int s){
memset(vis,0,sizeof(vis));
memset(dis,Inf,sizeof(dis));
priority_queuep;
p.push((Node){s,0});
dis[s]=0;
while(!p.empty()){
Node temp=p.top();
p.pop();
int u=temp.u;
if(vis[u]) continue;
vis[u]=1;
for(int i=0;itemp.val+val){
dis[v]=temp.val+val;
p.push((Node){v,dis[v]});
}
}
}
printf("%d\n",dis[n]);
}
int main(){
scanf("%d%d",&m,&n);
for(int i=0;i
代码三:79ms
#include
#include
#include
#define Inf 0x3f3f3f3f
using namespace std;
const int N = 1005;
struct node{
int u;
int v;
int val;
int next;
}edge[N*4];
int cnt,head[N];
int dis[N];
int n,m;
void add(int a,int b,int c){
edge[cnt].u=a; //起点
edge[cnt].v=b; //终点
edge[cnt].val=c;//权值
edge[cnt].next=head[a];
head[a]=cnt++;
}
void init(){
memset(head,-1,sizeof(head));
}
void BellmanFord(int s){ //遍历每条边
memset(dis,Inf,sizeof(dis));
dis[s]=0;
for(int i=1;i<=n;i++){
for(int k=0;kdis[u]+val){
dis[v]=dis[u]+val;
}
}
}
printf("%d\n",dis[n]);
}
int main(){
scanf("%d%d",&m,&n);
init();
for(int i=0;i