• 7-11 社交网络图中结点的“重要性”计算 (30 分)(Dijkstra算法)


    题意:

     思路:对每个输入的点跑一遍dijkstra算法,然后对这个点到所有点的距离求和按公式输出就可以了。

    (这次尝试了用数组模拟链表来做最短路问题,刷新了自己对最短路的理解)

    这里构造链表的过程我的理解一直有误差,第一行的式子中参与代码构建的是Next[cnt] = head[y];head[y] = cnt++;这两个语句。而前边的只是存了编号为cnt的边的另一个端点和这条边的花费。

    讲解见大佬博客:https://blog.csdn.net/major_zhang/article/details/52155279

    代码:

     1 #include <iostream>
     2 #include <queue>
     3 #include <cstdio>
     4 #include <algorithm>
     5 #include <cmath>
     6 #include <cstring>
     7 #include <queue>
     8 #include <vector>
     9 #define INF 0x3f3f3f3f
    10 #define FRE() freopen("in.txt","r",stdin)
    11 
    12 using namespace std;
    13 typedef long long ll;
    14 typedef pair<int,string> P;
    15 const int maxn = 20000;
    16 int Next[maxn],head[maxn],u[maxn],cost[maxn];
    17 int dist[maxn],vis[maxn];
    18 int n,m;
    19 
    20 int cnt = 0;
    21 void InsertEdge(int x,int y) {
    22     u[cnt] = x;cost[cnt] = 1;Next[cnt] = head[y];head[y] = cnt++;
    23     u[cnt] = y;cost[cnt] = 1;Next[cnt] = head[x];head[x] = cnt++;
    24 }
    25 
    26 void init() {
    27     memset(head,-1,sizeof(head));
    28     scanf("%d%d",&n,&m);
    29     for(int i = 0; i<m; i++) {
    30         int st,en;
    31         scanf("%d%d",&st,&en);
    32         InsertEdge(st,en);
    33     }
    34 }
    35 
    36 void Dijkstra(int v) {
    37     memset(dist,INF,sizeof(dist));
    38     for(int i = head[v]; ~i ; i = Next[i]) {
    39         dist[u[i]] = cost[i];
    40     }
    41     memset(vis,0,sizeof(vis));
    42     vis[v] = 1;
    43     dist[v] = 0;
    44     while(1) {
    45         int t = -1;
    46         for(int i = 1; i<=n; i++) {//寻找当前点的序列中还没有访问的最小的距离的点,这里的i指的是点
    47             if(!vis[i] && (t==-1 || dist[t]>dist[i]))
    48                 t = i;
    49         }
    50         if(t == -1)
    51             break;
    52         vis[t] = 1;
    53         for(int i = head[t]; ~i; i = Next[i]) {//从与该点相连的边找最小的花费,这里的i其实是表示的标号cnt
    54             if(dist[u[i]] > dist[t]+cost[i]){
    55                 dist[u[i]] = dist[t]+cost[i];
    56             }
    57             //dist[u[i]] = min(dist[u[i]], dist[t]+cost[i]);
    58         }
    59     }
    60     bool ok = false;
    61     int sum = 0;
    62     for(int i = 1; i<=n; i++) {
    63         if(dist[i]==INF) {
    64             ok = true;
    65             //cout<<"GG"<<endl;
    66             break;
    67         }
    68         sum += dist[i];
    69     }
    70    // printf("sum: %d   n: %d
    ",sum,n);
    71 
    72     if(ok)
    73         printf("Cc(%d)=0.00
    ",v);
    74     else
    75         printf("Cc(%d)=%.2f
    ",v,(1.0*(n-1))/(1.0*sum));
    76 }
    77 
    78 int main() {
    79     //FRE();
    80     int n,m;
    81     init();
    82     int num,t;
    83     scanf("%d",&num);
    84     for(int i = 0; i<num; i++) {
    85         scanf("%d",&t);
    86         Dijkstra(t);
    87     }
    88     return 0;
    89 }
    View Code
  • 相关阅读:
    sublime开启vim模式
    git命令行界面
    搬进Github
    【POJ 2886】Who Gets the Most Candies?
    【UVA 1451】Average
    【CodeForces 625A】Guest From the Past
    【ZOJ 3480】Duck Typing
    【POJ 3320】Jessica's Reading Problemc(尺取法)
    【HDU 1445】Ride to School
    【HDU 5578】Friendship of Frog
  • 原文地址:https://www.cnblogs.com/sykline/p/9737873.html
Copyright © 2020-2023  润新知