http://acm.hdu.edu.cn/showproblem.php?pid=2544
自己写的最短路第一题,dijstra算法
#include<stdio.h>
#include<iostream>
using namespace std;
int dp[105][105];
int dijstra(int beg,int end)
{
bool flag[105];
int path[105];
int i,min;
for(i=beg;i<=end;i++)
{
path[i]=INT_MAX;
flag[i]=true;
}
path[beg]=0;
flag[beg]=false;
while(beg!=end)
{
for(i=1;i<=end;i++)
{
if(dp[beg][i]&&path[i]>path[beg]+dp[beg][i])
path[i]=path[beg]+dp[beg][i];
}
min=INT_MAX;
for(i=1;i<=end;i++)
{
if(flag[i]&&path[i]<min)
{
beg=i;
min=path[i];
}
}
flag[beg]=false;
}
return path[end];
}
int main()
{
int n,m,a,b,c;
while(~scanf("%d%d",&n,&m),n+m)
{
memset(dp,0,sizeof(dp));
while(m--)
{
scanf("%d%d%d",&a,&b,&c);
if(!dp[a][b])
dp[a][b]=dp[b][a]=c;
else
dp[a][b]=dp[b][a]=c<dp[a][b]?c:dp[a][b];
}
printf("%d\n",dijstra(1,n));
}
return 0;
}
第一道的SPFA,关于SPFA下面这个博客讲的很清楚,orz呀
http://blog.sina.com.cn/s/blog_4f3b79d00100ao4z.html
#include<stdio.h>
#include<vector>
#include<queue>
#define MAX 105
#define INF 1<<28
using namespace std;
struct node
{
int v,w;
};
vector<node> g[MAX];
queue<int> q;
int n,m;
int spfa(int beg,int end)
{
int i,path[MAX];
bool flag[MAX];
for(i=1;i<=n;i++)
{
flag[i]=0;
path[i]=INF;
}
path[beg]=0;
flag[beg]=1;
q.push(beg);
while(!q.empty())
{
int k=q.front();
q.pop();
flag[k]=0;
for(i=0;i<g[k].size();i++)
{
int v=g[k][i].v;
int w=g[k][i].w;
if(path[v]>path[k]+w)
{
path[v]=path[k]+w;
if(!flag[v])
{
flag[v]=1;
q.push(v);
}
}
}
}
return path[end];
}
int main()
{
int a,b,c,i;
while(~scanf("%d%d",&n,&m),n+m)
{
for(i=0;i<=n;i++)
g[i].clear();
while(m--)
{
scanf("%d%d%d",&a,&b,&c);
node t;
t.v=a;
t.w=c;
g[b].push_back(t);
t.v=b;
g[a].push_back(t);
}
printf("%d\n",spfa(1,n));
}
return 0;
}