申請SAE

如果您發現本博客的外觀很難看,那是因為部分外觀文件被中國.國家.防火.牆屏.蔽所致!
請翻~牆!

我的Wordpress博客的地址: http://zhuyf.tk/

2012年1月30日 星期一

NOI2007 社交網絡 network 解題報告

【題目描述】 
 懶得貼上試題了~發個連結:NOI2007 Day1試題連結
 【分析】
這是這幾年NOI中最簡單的題了~就是一個多源最短路+乘法原理。 

用Map[i][j]表示i、j之間的最短路徑長度; 
用Path[i][j]表示i、j之間最短路徑的條數(初始化為1)。

 先用Floyd算法求每兩點之間的最短路,鬆弛時要注意,如果出現:
 Map[i][k]+Map[k][j]==Map[i][j] 則說明這又是最短路,所以Path[i][j]+=Path[i][k]*Path[k][j]。
 如果可以鬆弛,即Map[i][k]+Map[k][j]<Map[i][j],則Path[i][j]=Path[i][k]*Path[k][j]即可。

 最後亂搞一個三重循環求I(v),按照題意走即可AC。



 【我的代碼】
裸代碼RawCode

  1. #include <cstdio>
  2. #include <cstdlib>
  3. #define inputfile freopen("network.in","r",stdin)
  4. #define outputfile freopen("network.out","w",stdout)
  5. #define MAXN 101
  6. #define MAX 1000000000
  7. #define LL long long
  8. using namespace std;
  9. int N,M;
  10. int Map[MAXN][MAXN];
  11. LL Path[MAXN][MAXN];
  12. void init()
  13. {
  14.     fscanf(stdin,"%d %d\n",&N,&M);
  15.     for(int i=1;i<=N;i++)
  16.     {
  17.         for(int j=1;j<=N;j++)
  18.             Map[i][j]=MAX,Path[i][j]=1;
  19.         Map[i][i]=0;
  20.     }
  21.    
  22.     int a,b,v;
  23.     for (int i=1;i<=M;i++)
  24.     {
  25.         fscanf(stdin,"%d %d %d\n",&a,&b,&v);
  26.         Map[a][b]=v;
  27.         Map[b][a]=v;
  28.     }
  29. }
  30. void Floyd()
  31. {
  32.     for (int k=1;k<=N;k++)
  33.     {
  34.         for (int i=1;i<=N;i++)
  35.         {
  36.             for (int j=1;j<=N;j++)
  37.             {
  38.                 if(k==i || k==j || i==j)
  39.                         continue;
  40.                 if(Map[i][k]+Map[k][j]==Map[i][j])
  41.                     Path[i][j]+=Path[i][k]*Path[k][j];
  42.                 if(Map[i][k]+Map[k][j]<Map[i][j])
  43.                     Map[i][j]=Map[i][k]+Map[k][j],
  44.                     Path[i][j]=Path[i][k]*Path[k][j];
  45.             }
  46.         }
  47.     }
  48. }
  49. void solve()
  50. {
  51.     for (int v=1;v<=N;v++)
  52.     {
  53.         double Ans=0;
  54.         for (int s=1;s<=N;s++)
  55.         {
  56.             for (int t=1;t<=N;t++)
  57.             {
  58.                 if(s==v || t==v || s==t)
  59.                     continue;
  60.                 if(Map[s][v]+Map[v][t]!=Map[s][t])
  61.                     continue;
  62.                 double a=double(Path[s][v]*Path[v][t]);
  63.                 double b=double(Path[s][t]);
  64.                 double res=a/b;
  65.                 Ans+=res;
  66.             }
  67.         }
  68.         fprintf(stdout,"%.3lf\n",Ans);
  69.     }
  70. }
  71. int main()
  72. {
  73.     inputfile,outputfile;
  74.     init();
  75.     Floyd();
  76.     solve();
  77.     return 0;
  78. }

沒有留言:

張貼留言