先上题目:
Time Limit: 2000/1000 MS
(Java/Others) Memory Limit: 32768/32768 K
(Java/Others)
Total Submission(s): 1070 Accepted
Submission(s): 384
1 #include <cstdio> 2 #include <cstring> 3 #define max(x,y) (x > y ? x : y) 4 #define MAX 302 5 #define INF 1000000000 6 using namespace std; 7 8 int dis[MAX][MAX],dp[MAX][MAX]; 9 int n,m; 10 11 void flyod(){ 12 for(int u=1;u<=n;u++){ 13 for(int i=1;i<=n;i++){ 14 for(int j=1;j<=n;j++){ 15 if(dis[i][j]>dis[i][u]+dis[u][j]){ 16 dis[i][j]=dis[i][u]+dis[u][j]; 17 dp[i][j]=dp[i][u]+dp[u][j]; 18 }else if(dis[i][j]==dis[i][u]+dis[u][j]){ 19 dp[i][j]=max(dp[i][u]+dp[u][j],dp[i][j]); 20 } 21 } 22 } 23 } 24 } 25 26 int main() 27 { 28 int a,b,l; 29 int s1,e1,s2,e2; 30 int ans; 31 //freopen("data.txt","r",stdin); 32 while(scanf("%d %d",&n,&m),(n+m)){ 33 for(int i=1;i<=n;i++){ 34 for(int j=1;j<=n;j++){ 35 dis[i][j]= i==j ? 0 : INF; 36 dp[i][j]=0; 37 } 38 } 39 for(int i=0;i<m;i++){ 40 scanf("%d %d %d",&a,&b,&l); 41 if(dis[a][b]>l){ 42 dis[a][b]=dis[b][a]=l; 43 dp[a][b]=dp[b][a]=1; 44 } 45 } 46 47 scanf("%d %d %d %d",&s1,&e1,&s2,&e2); 48 flyod(); 49 ans=-1; 50 for(int i=1;i<=n;i++){ 51 for(int j=1;j<=n;j++){ 52 if(dp[i][j]>ans && (dis[s1][e1] == dis[s1][i]+dis[i][j]+dis[j][e1]) 53 && (dis[s2][e2] == dis[s2][i]+dis[i][j]+dis[j][e2]) ){ 54 ans=dp[i][j]; 55 } 56 } 57 } 58 printf("%d\n",ans+1); 59 } 60 return 0; 61 }
HDU - 2833 - WuKong,布布扣,bubuko.com
原文:http://www.cnblogs.com/sineatos/p/3570172.html