hdu4460-最短路&思维- Friend Chains

来源:互联网 发布:web数据挖掘第二版pdf 编辑:程序博客网 时间:2024/05/18 02:53

http://acm.hdu.edu.cn/showproblem.php?pid=4460
郁闷死,,开始用floyd写的,1e9左右。。
肯定超时,然后感觉暴力最短路这样 1e7了估计也够呛。
试一下是能写的。。暴力最短路。。
用了两种写法, 都是可以的。并且很像。

#include <bits/stdc++.h>using namespace std;const int maxn=20005;int m,n;const int inf=0x3f3f3f3f;map<string,int>mp;string s,s2;int d[maxn];int len;int head[maxn];struct Node{   int to,from,next;}node[maxn];void add(int a,int b,int c){     node[len].to=b;     node[len].next=head[a];     head[a]=len++;}void init(){    len=0;    memset(head,-1,sizeof(head));}bool vis[maxn];/*void spfa(int s){     queue<int>q;     memset(vis,false,sizeof(vis));     memset(d,0x3f,sizeof(d));     q.push(s);     d[s]=0;     vis[s]=true;     while(!q.empty()){           int u=q.front();               q.pop();             vis[u]=false;          for(int i=head[u];i!=-1;i=node[i].next){               int to=node[i].to;               if(d[to]>d[u]+1){                d[to]=d[u]+1;                if(!vis[to]){                  vis[to]=true;                  q.push(to);               }               }          }     }}*/struct qnode{   int to,dis;    qnode(int _a,int _b){to=_a,dis=_b;}    bool operator<(const qnode&r)const{         return dis>r.dis;    }};void dijkstra(int s){     priority_queue<qnode>q;     memset(d,0x3f,sizeof(d));     memset(vis,false,sizeof(vis));     q.push(qnode(s,0));     d[s]=0;     vis[s]=true;     while(!q.empty()){           qnode u=q.top();            q.pop();            vis[u.to]=false;            for(int i=head[u.to];i!=-1;i=node[i].next){                 int to=node[i].to;                 if(d[to]>d[u.to]+1){                    d[to]=d[u.to]+1;                    if(!vis[to]){                        vis[to]=true;                        q.push(qnode(to,d[to]));                    }                 }            }     }}int main(){   ios::sync_with_stdio(false);    while(cin>>m){          mp.clear();          if(!m) break;          init();          for(int i=1;i<=m;i++){              cin>>s;              mp[s]=i;          }         cin>>n;          for(int i=0;i<n;i++){             cin>>s>>s2;              add(mp[s],mp[s2],1);              add(mp[s2],mp[s],1);          }          bool flag=false;          int ans=-1;          for(int i=1;i<=m&&!flag;i++){              dijkstra(i);              for(int j=1;j<=m&&!flag;j++){                  if(i==j)continue;                ans=max(ans,d[j]);                if(d[j]==inf){                    flag=true;                }              }          }          if(flag)            puts("-1");          else            printf("%d\n",ans);     }    return 0;}