杭电oj ----2544
深 搜
Accepted | 2544 | 327MS | 1768K | 635 B | C++ |
#include <cstdio> #include <cstring> const int INF=0x3f3f3f3f; int n,m,a,b,c,mp[105][105],ans; bool use[105]; void dfs(int k,int l){ for(int i=2;i<=n;i++) { if(l>ans) return; if(k==n) { ans=l; return; } if(use[i]==false) { use[i]=true; dfs(i,l+mp[k][i]); use[i]=false; } } } int main() { while(scanf("%d%d",&n,&m)!=EOF&&(n||m)) { ans=INF; memset(mp,INF,sizeof(mp)); for(int i=1;i<=m;i++) { scanf("%d%d%d",&a,&b,&c); if(mp[a][b]>c) mp[a][b]=mp[b][a]=c; } use[1]=true; dfs(1,0); printf("%d\n",ans); } return 0; }
弗 洛 伊 德(Floyd)
Accepted | 2544 | 31MS | 1260K | 600 B | G++ |
#include <cstdio> #include <cstring> using namespace std; const int INF=0x3f3f3f; int n,m,a,b,c,mp[105][105]; int main() { int i,j,k; while(scanf("%d%d",&n,&m)!=EOF&&(m||n)) { memset(mp,INF,sizeof(mp)); for(int i=0;i<m;i++) { scanf("%d%d%d",&a,&b,&c); if(mp[a][b]>c) mp[a][b]=mp[b][a]=c; } for(k=1;k<=n;k++) for(i=1;i<=n;i++) for(j=1;j<=n;j++) if(mp[i][k]+mp[k][j]<mp[i][j]) mp[i][j]=mp[i][k]+mp[k][j]; printf("%d\n",mp[1][n]); } return 0; }
第 杰 斯 特 拉
Accepted | 2544 | 15MS | 1260K | 811 B | G++ |
#include<cstdio> #include <cstring> using namespace std; const int INF=0x3f3f3f3f; int ans[105],n,m,mp[105][105],a,b,c; bool use[105]; void dij(){ for(int i=2;i<=n;i++) ans[i]=mp[1][i]; ans[1]=0; memset(use,true,sizeof(use)); use[1]=false; for(int i=2;i<n;i++) { int v,f=INF; for(int j=1;j<=n;j++) if(ans[j]<=f&&use[j]) { f=ans[j]; v=j; } for(int j=1;j<=n;j++) if(ans[v]+mp[v][j]<ans[j]) ans[j]=ans[v]+mp[v][j]; use[v]=false; } } int main() { while(scanf("%d%d",&n,&m)!=EOF&&(n||m)) { memset(mp,INF,sizeof(mp)); for(int i=1;i<=m;i++) { scanf("%d%d%d",&a,&b,&c); if(mp[a][b]>c) mp[a][b]=mp[b][a]=c; } dij(); printf("%d\n",ans[n]); } return 0; }
#include <iostream> #include <cstring> #include <cstdio> using namespace std; int mp[1002][1002]; bool use[1002]; int ans[1002]; const int INF = 0x3f3f3f3f; int n; void dij(int a){ ans[a] = 0;//设定起点 for(int i = 1 ; i < n ; i++){ int min1 = INF,min2; for(int j = 1 ; j <= n ; j++){ if(use[j] && ans[j] < min1){ min1=ans[j]; min2=j; } } use[min2]=false; for(int j=1;j<=n;j++){ if(min1+mp[min2][j] < ans[j]){ ans[j] = mp[min2][j] + min1; } } } } int main(){ int t,s,d; while(scanf("%d%d%d",&t,&s,&d)!=EOF){ memset(mp,INF,sizeof(mp)); int x,y,time ; int max2 =0; for(int i = 0 ; i < t ; i++){ scanf("%d%d%d",&x,&y,&time); int max1 = x > y ? x : y; max2 = max2 > max1 ? max2 : max1; if(mp[x][y]>time) mp[x][y]=mp[y][x]=time;//录入地图 } n = max2;//记录ID最大的城市 int min1 = INF; int m[1003],n[1003]; for(int i = 0 ; i < s ; i ++) scanf("%d",&m[i]); for(int i = 0 ;i < d ; i ++) scanf("%d",&n[i]); for(int i = 0 ; i < s ; i ++){ memset(use,true,sizeof(use)); memset(ans,INF-1,sizeof(ans)); dij(m[i]); for(int j = 0 ; j < d ; j ++){ if( ans[n[j]] < min1 )//ans[n[j]]为到n[j]的距离,选取一个最小值 min1 = ans[n[j]]; } } printf("%d\n",min1); } return 0; }
Accepted | 2066 | 140MS | 5680K | 1494 B | C++ |