HDU 4460 Friend Chains(SPFA+邻接表)

题目链接

其实这是我第一次敲邻接表+spfa,暑假的时候做过很多spfa题目,我一个没切,从头学起啊。。。切这个题,纯为熟悉模版。

 1 #include <iostream>

 2 #include <cstdio>

 3 #include <cstring>

 4 #include <queue>

 5 #include <map>

 6 using namespace std;

 7 #define N 100000000

 8 int d[1001],in[1001],first[2001],t;

 9 map <string,int> na;

10 struct node

11 {

12     int w,u,v,next;

13 }gra[20001];

14 void init()

15 {

16     t = 1;

17     memset(first,-1,sizeof(first));

18 }

19 void add(int u,int v,int w)

20 {

21     gra[t].u = u;

22     gra[t].v = v;

23     gra[t].w = 1;

24     gra[t].next = first[u];//交换头指针

25     first[u] = t;

26     t ++;

27 }

28 int main()

29 {

30     int i,j,n,m,x,ans;

31     char s1[11],s2[11];

32     while(scanf("%d",&n)!=EOF)

33     {

34         if(n == 0) break;

35         na.clear();

36         init();

37         for(i = 1; i <= n; i ++)

38         {

39             scanf("%s",s1);

40             na[s1] = i;

41         }

42         scanf("%d",&m);

43         t = 1;

44         for(i = 1; i <= m; i ++)

45         {

46             scanf("%s%s",s1,s2);

47             add(na[s1],na[s2],1);

48             add(na[s2],na[s1],1);

49         }

50         queue<int> que;

51         ans = -1;

52         for(j = 1; j <= n; j ++)

53         {

54             for(i = 1; i <= n; i ++)

55             {

56                 d[i] = N;

57                 in[i] = 0;

58             }

59             que.empty();

60             que.push(j);

61             d[j] = 0;

62             in[j] = 1;

63             while(!que.empty())

64             {

65                 x = que.front();

66                 que.pop();

67                 in[x] = 0;

68                 for(i = first[x]; i != -1;i = gra[i].next)

69                 {

70                     if(d[gra[i].v] > d[x]+gra[i].w)

71                     {

72                         d[gra[i].v] = d[x]+gra[i].w;

73                         if(!in[gra[i].v])

74                         {

75                             que.push(gra[i].v);

76                             in[gra[i].v] = 1;

77                         }

78                     }

79                 }

80             }

81             for(i = 1;i <= n;i ++)

82             {

83                if(ans < d[i])

84                {

85                    ans = d[i];

86                }

87             }

88         }

89         if(ans == N)

90         printf("-1\n");

91         else

92         printf("%d\n",ans);

93     }

94     return 0;

95 }

你可能感兴趣的:(chain)