您的位置:首页 > 其它

HDU 1874 畅通工程续

2012-07-25 09:42 302 查看
http://acm.hdu.edu.cn/showproblem.php?pid=1874

第一次floyd算法,求最短路

#include<stdio.h>
#include<iostream>
using namespace std;
const int M=1<<29;
int map[201][201];
int n,m;
void floyd()
{
int k,i,j;
for(k=0;k<n;k++)
for(i=0;i<n;i++)
for(j=0;j<n;j++)
map[i][j] = min(map[i][k] + map[k][j], map[i][j]);
}
int main()
{
int a,b,c,p,q,i,j;
while(~scanf("%d%d",&n,&m))
{
for(i=0;i<n;i++)
for(j=0;j<n;j++)
map[i][j]=i==j?0:M;
while(m--)
{
scanf("%d%d%d",&a,&b,&c);
if(c<map[a][b])
map[a][b]=map[b][a]=c;
}
scanf("%d%d",&p,&q);
floyd();
printf("%d\n",(map[p][q]<M)?map[p][q]:-1);
}
return 0;
}

再来个dijstra的

#include<stdio.h>
#include<string.h>
#define MAX 1<<28
int map[205][205];
int n,m;
int dijstra(int beg,int end)
{
bool flag[205];
int path[205];
int i,min,x;
for(i=0;i<n;i++)
{
path[i]=MAX;
flag[i]=true;
}
path[beg]=0;
flag[beg]=false;
x=n-1;
while(x--)
{
for(i=0;i<n;i++)
{
if(map[beg][i]&&path[i]>path[beg]+map[beg][i])
path[i]=path[beg]+map[beg][i];
}
min=MAX;
for(i=0;i<n;i++)
{
if(flag[i]&&min>path[i])
{
min=path[i];
beg=i;
}

}
flag[beg]=false;
}
path[end]=path[end]<MAX?path[end]:-1;
return path[end];
}
int main()
{
int a,b,c,beg,end;
while(~scanf("%d%d",&n,&m))
{
memset(map,0,sizeof(map));
while(m--)
{
scanf("%d%d%d",&a,&b,&c);
if(map[a][b])
map[a][b]=map[b][a]=c<map[a][b]?c:map[a][b];
else
map[a][b]=map[b][a]=c;
}
scanf("%d%d",&beg,&end);
printf("%d\n",dijstra(beg,end));
}
return 0;
}

再贴上一个SPFA的,刚开始学习尽量每道题用多种算法都写一变,这样记得更牢

#include<stdio.h>
#include<vector>
#include<queue>
#define MAX 205
#define INF 1<<28
using namespace std;
int n,m;
struct node
{
int v,w;
};
vector<node> g[MAX];
queue<int> q;
int spfa(int beg,int end)
{
int i,path[MAX];
bool flag[MAX];
for(i=0;i<n;i++)
{
path[i]=INF;
flag[i]=0;
}
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]<INF?path[end]:-1;
}
int main()
{
int a,b,c,i;
int beg,end;
while(~scanf("%d%d",&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);
}
scanf("%d%d",&beg,&end);
printf("%d\n",spfa(beg,end));
}
return 0;
}


 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  ini 算法 c