HDU 1874 通畅工程续(Dijkstra)
2016-01-24 11:05
357 查看
题目链接:HDU 1874
分析:直接套模版即可。
CODE:
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
using namespace std;
const int maxint=999999;
const int maxnum=100;
int dist[maxnum];
int pre[maxnum];
int c[maxnum][maxnum];
int n,line;
void Dijkstra(int n,int v,int *dist,int *pre,int c[maxnum][maxnum])
{
int s[maxnum];
for(int i=0;i<n;i++)
{
dist[i]=c[v][i];
s[i]=0;
if(dist[i]==maxint) pre[i]=0;
else pre[i]=v;
}
dist[v]=0;
s[v]=1;
for(int i=1;i<n;i++)
{
int tmp=maxint;
int u=v;
for(int j=0;j<n;j++)
if((!s[j])&&dist[j]<tmp)
{
u=j;
tmp=dist[j];
}
s[u]=1;
for(int j=0;j<n;j++)
{
if((!s[j])&&c[u][j]<maxint)
{
int newdist=c[u][j]+dist[u];
if(newdist<dist[j])
{
dist[j]=newdist;
pre[j]=u;
}
}
}
}
}
int main()
{
#ifdef LOCAL
freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
#endif
while(cin>>n>>line)
{
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
c[i][j]=maxint;
int p,q,len;
for(int i=1;i<=line;i++)
{
cin>>p>>q>>len;
if(len<c[p][q])
{
c[p][q]=len;
c[q][p]=len;
}
}
int start,end;
cin>>start>>end;
for(int i=0;i<n;i++)
dist[i]=maxint;
Dijkstra(n,start,dist,pre,c);
if(dist[end]==maxint) cout<<-1<<endl;
else cout<<dist[end]<<endl;
}
return 0;
}
分析:直接套模版即可。
CODE:
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
using namespace std;
const int maxint=999999;
const int maxnum=100;
int dist[maxnum];
int pre[maxnum];
int c[maxnum][maxnum];
int n,line;
void Dijkstra(int n,int v,int *dist,int *pre,int c[maxnum][maxnum])
{
int s[maxnum];
for(int i=0;i<n;i++)
{
dist[i]=c[v][i];
s[i]=0;
if(dist[i]==maxint) pre[i]=0;
else pre[i]=v;
}
dist[v]=0;
s[v]=1;
for(int i=1;i<n;i++)
{
int tmp=maxint;
int u=v;
for(int j=0;j<n;j++)
if((!s[j])&&dist[j]<tmp)
{
u=j;
tmp=dist[j];
}
s[u]=1;
for(int j=0;j<n;j++)
{
if((!s[j])&&c[u][j]<maxint)
{
int newdist=c[u][j]+dist[u];
if(newdist<dist[j])
{
dist[j]=newdist;
pre[j]=u;
}
}
}
}
}
int main()
{
#ifdef LOCAL
freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
#endif
while(cin>>n>>line)
{
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
c[i][j]=maxint;
int p,q,len;
for(int i=1;i<=line;i++)
{
cin>>p>>q>>len;
if(len<c[p][q])
{
c[p][q]=len;
c[q][p]=len;
}
}
int start,end;
cin>>start>>end;
for(int i=0;i<n;i++)
dist[i]=maxint;
Dijkstra(n,start,dist,pre,c);
if(dist[end]==maxint) cout<<-1<<endl;
else cout<<dist[end]<<endl;
}
return 0;
}
相关文章推荐
- 基于Java实现的Dijkstra算法示例
- Dijkstra和floyd——求单源点最短路径
- 初学图论-Dijkstra单源最短路径算法
- 初学图论-Dijkstra单源最短路径算法基于优先级队列(Priority Queue)的实现
- Dijkstra算法的粗略学习
- HDU 1568
- HDU1290
- HDU1568(Fobonacci公式)
- HDU ACM Step 2.2.2 Joseph(约瑟夫环问题)
- HDU 1405
- HDU 1297
- hdu 1205
- hdu 2087
- hdu 1016
- HDU 4898 The Revenge of the Princess’ Knight ( 2014 Multi-University Training Contest 4 )
- HDU 5592 ZYB's Premutation 线段树(查找动态区间第K大)
- 【高手回避】poj3268,一道很水的dijkstra算法题
- HDU 5240 Exam (好水的题)
- HDU5237 Base64 大模拟
- poj2387 Til the Cows Come Home—Dijkstra模板