| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
二次BFS可以解决吧In Reply To:Keeps WA... 谁有数据? Posted by:shit at 2004-11-06 11:45:56 > #include <iostream>
> #include <cstdlib>
> #include <memory>
> using namespace std;
> const int maxn=40001;
> struct dist_type
> {
> int pre,val;
> }dist[maxn];
> int q[maxn],al[maxn][4],len[maxn][4],ans[maxn][2];
> bool e[maxn];
> void build_tree(int root)
> {
> int head,tail,temp,i,j;
> head=tail=0;q[0]=root;
> e[root]=1;
> do
> {
> temp=tail;
> for(i=head;i<=temp;i++)
> {
> for(j=0;j<4;j++)
> if(!al[q[i]][j])break;
> else
> if(!e[al[q[i]][j]])
> {
> dist[al[q[i]][j]].pre=q[i];
> tail++;
> q[tail]=al[q[i]][j];
> e[al[q[i]][j]]=1;
> }
> }
> head=temp+1;
> }while(tail>=head);
> }
> int main(int argc, char *argv[])
> {
> int i,j,x,y,head,tail,temp,sum,max,n,m;
> char c;
> while(cin>>n>>m)
> {
> memset(dist,0,sizeof(dist));
> memset(e,0,sizeof(e));
> memset(ans,0,sizeof(ans));
> memset(al,0,sizeof(al));
> for(i=0;i<m;i++)
> {
> fin>>x>>y>>sum>>c;
> for(j=0;j<4;j++)
> if(!al[x][j])
> {
> al[x][j]=y;
> len[x][j]=sum;
> break;
> }
> for(j=0;j<4;j++)
> if(!al[y][j])
> {
> al[y][j]=x;
> len[y][j]=sum;
> break;
> }
> }
> for(i=1;i<=n;i++)
> if(!dist[i].pre)
> build_tree(i);
> head=0;tail=-1;
> for(i=1;i<=n;i++)
> if(dist[i].pre)
> e[dist[i].pre]=0;
> for(i=1;i<=n;i++)
> {
> if(e[i])
> {
> tail++;q[tail]=i;
> }
> }
> do
> {
> temp=tail;
> for(i=head;i<=temp;i++)
> {
> if(!dist[q[i]].pre)continue;
> if(!e[dist[q[i]].pre])
> {
> tail++;q[tail]=dist[q[i]].pre;
> e[q[tail]]=1;
> }
> for(j=0;j<4;j++)
> if(al[q[i]][j]==dist[q[i]].pre)
> break;
> if(len[q[i]][j]+dist[q[i]].val>dist[dist[q[i]].pre].val)
> dist[dist[q[i]].pre].val=len[q[i]][j]+dist[q[i]].val;
> if(len[q[i]][j]+dist[q[i]].val>ans[dist[q[i]].pre][0])
> {
> ans[dist[q[i]].pre][1]=ans[dist[q[i]].pre][0];
> ans[dist[q[i]].pre][0]=len[q[i]][j]+dist[q[i]].val;
> }
> else
> if(len[q[i]][j]+dist[q[i]].val>ans[dist[q[i]].pre][1])
> ans[dist[q[i]].pre][1]=len[q[i]][j]+dist[q[i]].val;
> }
> head=temp+1;
> }while(tail>=head);
> max=0;
> for(i=1;i<=n;i++)
> if(ans[i][0]+ans[i][1]>max)
> max=ans[i][0]+ans[i][1];
> cout<<max<<endl;
> }
> //system("PAUSE");
> return 0;
> }
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator