POJ 2387 Til the Cows Come Home(Dijkstra)
2016-01-24 11:14
288 查看
题目链接:POJ 2387
分析:直接套Dijkstra的模版。
CODE:
#include <iostream>
#include <cstring>
#include <string>
using namespace std;
const int maxint=0x3f3f3f;
const int maxnum=1005;
int dis[maxnum];
int pre[maxnum];
int c[maxnum][maxnum];
int n,t;
void Dijkstra(int n,int v,int *dis,int *pre, int c[maxnum][maxnum])
{
int vis[maxnum];
memset(vis,0,sizeof(vis));
for(int i=1;i<=n;i++)
{
dis[i]=c[v][i];
if(dis[i]==maxint) pre[i]=0;
else pre[i]=v;
}
dis[v]=0;
vis[v]=1;
for(int i=1;i<=n;i++)
{
int tmp=maxint;
int u=v;
for(int j=1;j<=n;j++)
{
if((!vis[j])&&dis[j]<tmp)
{
tmp=dis[j];
u=j;
}
}
vis[u]=1;
for(int j=1;j<=n;j++)
{
if((!vis[j])&&c[u][j]<maxint)
{
if(c[u][j]+dis[u]<dis[j])
{
dis[j]=c[u][j]+dis[u];
pre[j]=u;
}
}
}
}
}
void SearchPath(int *pre,int v,int u)
{
int path[maxnum];
int tot=1;
path[tot++]=u;
int tmp=pre[u];
while(tmp!=v)
{
path[tot++]=tmp;
tmp=pre[tmp];
}
path[tot]=v;
for(int i=tot;i>=1;i--)
{
if(i==1) cout<<path[i]<<endl;
else cout<<path[i]<<"->";
}
}
int main()
{
#ifdef LOCAL
freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
#endif
while(cin>>t>>n)
{
for(int i=1;i<=n;i++)
{
dis[i]=maxint;
for(int j=1;j<=n;j++)
c[i][j]=maxint;
}
int p,q,len;
for(int i=1;i<=t;i++)
{
cin>>p>>q>>len;
if(len<c[p][q])
c[p][q]=c[q][p]=len;
}
Dijkstra(n,1,dis,pre,c);
//SearchPath(pre,1,n);
cout<<dis
<<endl;
}
return 0;
}
分析:直接套Dijkstra的模版。
CODE:
#include <iostream>
#include <cstring>
#include <string>
using namespace std;
const int maxint=0x3f3f3f;
const int maxnum=1005;
int dis[maxnum];
int pre[maxnum];
int c[maxnum][maxnum];
int n,t;
void Dijkstra(int n,int v,int *dis,int *pre, int c[maxnum][maxnum])
{
int vis[maxnum];
memset(vis,0,sizeof(vis));
for(int i=1;i<=n;i++)
{
dis[i]=c[v][i];
if(dis[i]==maxint) pre[i]=0;
else pre[i]=v;
}
dis[v]=0;
vis[v]=1;
for(int i=1;i<=n;i++)
{
int tmp=maxint;
int u=v;
for(int j=1;j<=n;j++)
{
if((!vis[j])&&dis[j]<tmp)
{
tmp=dis[j];
u=j;
}
}
vis[u]=1;
for(int j=1;j<=n;j++)
{
if((!vis[j])&&c[u][j]<maxint)
{
if(c[u][j]+dis[u]<dis[j])
{
dis[j]=c[u][j]+dis[u];
pre[j]=u;
}
}
}
}
}
void SearchPath(int *pre,int v,int u)
{
int path[maxnum];
int tot=1;
path[tot++]=u;
int tmp=pre[u];
while(tmp!=v)
{
path[tot++]=tmp;
tmp=pre[tmp];
}
path[tot]=v;
for(int i=tot;i>=1;i--)
{
if(i==1) cout<<path[i]<<endl;
else cout<<path[i]<<"->";
}
}
int main()
{
#ifdef LOCAL
freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
#endif
while(cin>>t>>n)
{
for(int i=1;i<=n;i++)
{
dis[i]=maxint;
for(int j=1;j<=n;j++)
c[i][j]=maxint;
}
int p,q,len;
for(int i=1;i<=t;i++)
{
cin>>p>>q>>len;
if(len<c[p][q])
c[p][q]=c[q][p]=len;
}
Dijkstra(n,1,dis,pre,c);
//SearchPath(pre,1,n);
cout<<dis
<<endl;
}
return 0;
}
相关文章推荐
- 基于Java实现的Dijkstra算法示例
- Dijkstra和floyd——求单源点最短路径
- 初学图论-Dijkstra单源最短路径算法
- 初学图论-Dijkstra单源最短路径算法基于优先级队列(Priority Queue)的实现
- 初学ACM - 组合数学基础题目PKU 1833
- POJ ACM 1001
- POJ ACM 1002
- 1611:The Suspects
- POJ1089 区间合并
- Dijkstra算法的粗略学习
- POJ 2635 The Embarrassed Cryptographe
- POJ 3292 Semi-prime H-numbers
- POJ 2773 HAPPY 2006
- POJ 3090 Visible Lattice Points
- POJ-2409-Let it Bead&&NYOJ-280-LK的项链
- POJ-1695-Magazine Delivery-dp
- POJ1523 SPF dfs
- POJ-1001 求高精度幂-大数乘法系列
- POJ-1003 Hangover
- POJ-1004 Financial Management