HDU 1874 畅通工程续

来源:互联网 发布:java filereader 方法 编辑:程序博客网 时间:2024/04/29 18:53

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<<28int 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];elsemap[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<<28using 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;}