| ||||||||||
| 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 | |||||||||
Re:牛啊!救救小第,怎么会超时啊!应该怎样优化In Reply To:牛啊!救救小第,怎么会超时啊!应该怎样优化 Posted by:04105330 at 2008-07-05 20:00:10 > #include<iostream>
> #include<queue>
> #define INF 100000
> using namespace std;
> struct st {
> int i;
> int j;
> }stu[150],a,d;
> char str[100][100],ch;
> int n,m,length;
> int c[150][150];
> int step;
> queue<st> q;
> void dfs(st b){
> step = 0;
> int e[150][150],i,j;
> for(i = 0;i<n;i++)
> for(j = 0;j<m;j++)
> e[i][j] = 0;
> while (1) {
> int len = q.size();
> while(len>0){
> a = q.front();
> if(a.i == b.i&&a.j==b.j)
> return ;
> if(a.i-1>=0&&str[a.i-1][a.j]!='#'&&e[a.i-1][a.j]==0){
> d.i = a.i -1;
> d.j = a.j;
> q.push(d);
> e[d.i][d.j] = 1;
> }
> if(a.i+1<n&&str[a.i+1][a.j]!='#'&&e[a.i+1][a.j]==0){
> d.i = a.i+1;
> d.j = a.j;
> q.push(d);
> e[d.i][d.j] = 1;
> }
> if(a.j+1<m&&str[a.i][a.j+1]!='#'&&e[a.i][a.j+1]==0){
> d.i = a.i;
> d.j = a.j+1;
> q.push(d);
> e[d.i][d.j] = 1;
> }
> if(a.j-1>=0&&str[a.i][a.j-1]!='#'&&e[a.i][a.j-1]==0){
> d.i = a.i;
> d.j = a.j-1;
> q.push(d);
> e[d.i][d.j] = 1;
> }
> len--;
> q.pop();
>
> }
> step++;
> }
> }
> void prim(){
> int lowcost[150];
> int closet[150];
> bool s[150];
> s[0] = true;
> int i,j,k;
> for(i = 1;i<length;i++){
> lowcost[i] = c[0][i];
> closet[i] = 1;
> s[i] = false;
> }
>
> for(i = 0;i<n;i++){
> int min = INF;
> j = 0;
> for(k = 1;k<length;k++)
> if(lowcost[k]<min&&(!s[k])){
> min = lowcost[k];
> j = k;
> }
> s[j] = true;
> for(k = 1;k<length;k++)
> if(c[j][k]<lowcost[k]&&(!s[k])){
> lowcost[k] = c[j][k];
> closet[k]=j;
> }
> }
> int sum = 0;
> for(i = 1;i<length;i++)
> sum+=lowcost[i];
> printf("%d\n",sum);
>
>
> }
> int main()
> {
> int t,i,j;
> // freopen("in.txt","r",stdin);
> scanf("%d",&t);
> while (t--) {
> scanf("%d%d",&m,&n);
> length = 0;
> for(i = 0;i<n;i++){
> scanf("%c",&ch);
> for(j = 0;j<m;j++){
> scanf("%c",&str[i][j]);
> if(str[i][j]=='S'||str[i][j]=='A'){
> stu[length].i = i;
> stu[length].j = j;
> length++;
> }
> }
> }
> for(i = 0;i<length;i++){
> c[i][i] = 0;
> for(j = i+ 1;j<length;j++){
> q.push(stu[i]);
> dfs(stu[j]);
> c[i][j] = step;
> c[j][i] = step;
> step = 0;
> while (!q.empty())
> q.pop();
> }
> }
> prim();
> }
> return 0;
> }
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator