#include<string> #include<memory.h> #include<iostream> #include<stdlib.h> using namespace std; struct load{ int point; load*next; }; int shortload(int start,int matrix[][105],int point,load **load_path); const int INF=10000000; int visit[105]; int matrix[105][105]; int dis[105]; int path[105][105]; load * load_path[105]; int main() { int T,x; cin>>T; for(x=1;x<T+1;x++) { cout<<"Case #:"<<x<<endl; int point,line,length; int start_x,end_x; int i,j,k,l; cin>>point; for( i=0;i<point;i++) for( j=0;j<point;j++) matrix[i][j]=INF; for(i=0;i<point-1;i++) { int start,end; cin>>start>>end>>length; matrix[start-1][end-1]=matrix[end-1][start-1]=length; } int question; cin>>question; while(question--) { memset(path,0,105*105*sizeof(int )); cin>>start_x>>end_x; for( i=0;i<point;i++) { load_path[i]=(load*)malloc(sizeof(load)); load_path[i]->point=start_x-1; load* p=(load*)malloc(sizeof(load)); p->point=i; p->next=NULL; load_path[i]->next=p; } shortload(start_x-1,matrix,point,load_path); load* p=load_path[end_x-1]; i=0; if(p) { while(p->next) { path[end_x-1][i]=matrix[p->point][p->next->point]; i++; p=p->next; } } int flag=0; if(i<3) cout<<"No"<<endl; else { for(j=0;j<i-2;j++) for( k=j+1;k<i-1;k++) for(l=k+1;l<i;l++) { if((path[end_x-1][j]+path[end_x-1][k]>path[end_x-1][l])&&(path[end_x-1][j]-path[end_x-1][k]<path[end_x-1][l]) &&(path[end_x-1][j]+path[end_x-1][l]>path[end_x-1][k])&&(path[end_x-1][j]-path[end_x-1][l]<path[end_x-1][k]) &&(path[end_x-1][k]+path[end_x-1][l]>path[end_x-1][j])&&(path[end_x-1][k]-path[end_x-1][l]<path[end_x-1][j]) ) { cout<<"Yes"<<endl; flag=1; k=i-1; j=i-2; break; } } if(flag==0) cout<<"No"<<endl; } } } } int shortload(int start,int matrix[][105],int point,load ** load_path) { for(int i=0;i<point;i++) { dis[i]=matrix[start][i]; visit[i]=0; } visit[start]=1; dis[start]=0; int x=0; for(int i=0;i<point;i++) { int min=INF; for(int j=0;j<point;j++) { if(dis[j]<min&&visit[j]==0) { min=dis[j]; x=j; } } visit[x]=1; for(int j=0;j<point;j++) if(visit[j]==0&&dis[x]+matrix[x][j]<dis[j]) { load*p=load_path[x]->next; while(p) { load* q=(load*)malloc(sizeof(load)); q->next=load_path[j]->next; load_path[j]->next=q; p=p->next; } p=load_path[x]->next; load*q=load_path[j]->next; while(p) { q->point=p->point; p=p->next; q=q->next; } dis[j]=dis[x]+matrix[x][j]; } } return 0; }
使用RE,放弃了,反正资格赛只要一道题就可以了,交给大家去解决吧。
高手用Java写的,大数据应该也没有问题:
https://github.com/castorgmc/LeetCode/blob/master/src/problems/Main.java