hdu 2112 HDU Today(spfa+map+vector)

小記:這題完全是爲了練習stl的,畢竟解法有很多,做的過程中,確實發現我的stl能力以及對平臺的瞭解確實很不到位,wa了N次。


思路:我寫的代碼是spfa+map+vector

spfa來尋找最短路, map來對字符串打上標記,vector來當鄰接表。用以加速spfa。雖然我當初是覺得自己寫個前向星也是可以的。當時純當練stl了。

這題也可以用dijsktra來找最短路,trie樹來hash,鄰接表的話自己可以隨便選,數組的鄰接表當然更快些。 所以前向星是個不錯的選擇。

因爲dijsktra寫的比較多,而spfa很久沒寫了,於是就用了spfa。

之前用scanf輸入字符串,定義是 char str[MAX_]; string s1;  scanf讀站名到str裏, 然後我直接賦給s1的,因爲用的是map。即s1 = str;

這樣我的codeblocks 是沒報錯或者警告的,而hdu的平臺也沒報錯,但是TLE。 應該是很花時間的,交的c++的。所以改了用cin讀入。

而且這裏也出了wa,我沒include<string>,  但是我定義string s1; 也沒報錯,codeblocks全自動添加的。。。。 然後提交上去就CE

然後g++ TLE,  c++ 1670+ms 過的。


代碼:

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
#include <map>
#include <set>
#include <vector>
#include <stack>
#include <queue>
#include <algorithm>
#include <string>

using namespace std;

#define mst(a,b) memset(a,b,sizeof(a))
#define REP(a,b,c) for(int a = b; a < c; ++a)
#define eps 10e-8

const int MAX_ = 155;
const int N = 100010;
const int INF = 0x7fffffff;

int n;

struct node{
    int s, t;
};

map<string, int> mp;
vector<node> g[MAX_];

int d[MAX_];
bool vis[MAX_];
int m, cnt;

void spfa(int start, int end)
{
    queue<int> q;
    q.push(start);
    REP(i, 0, MAX_){
        vis[i] = 0;
        d[i] = INF;
    }
    vis[start] = 1;
    d[start] = 0;

    while(!q.empty()){
        int cur = q.front(); q.pop();

        vis[cur] = 0;

        REP(i, 0, g[cur].size()){
            int s, t;
            s = g[cur][i].s;
            t = g[cur][i].t;
            if(d[s] > d[cur] + t){
                d[s] =  d[cur] + t;
                if(!vis[s]){
                    vis[s] = 1;
                    q.push(s);
                }
            }
        }
    }
    if(d[end] >= INF){
            puts("-1");//printf("-1\n");
    }else
        printf("%d\n", d[end]);

    return ;
}


int main(){
	int T, ss, tt;

	while(~scanf("%d", &n)){
	    if(n == -1)break;
        mp.clear();

        REP(i, 0, MAX_){
            g[i].clear();
        }
        cnt = 1;

        string s1,s2;
        cin>>s1>>s2;
        /*
        if(s1.compare(s2) == 0 ){
            printf("0\n");continue;
        }
        else if(n == 0){
            printf("-1\n");continue;
        }
        */
        ss = mp[s1] = cnt++;
        
        if(mp[s2] == 0)
            mp[s2] = cnt++;
        tt = mp[s2];
        REP(i, 0, n){

            cin>>s1>>s2>>m;

            int s, t;

            if(mp[s1] == 0){
                mp[s1] = cnt++;
            }
            s = mp[s1];
            if(mp[s2] == 0){
                mp[s2] = cnt++;
            }
            t = mp[s2];
            node tmp;
            tmp.t = m;
            tmp.s = s;
            g[t].push_back(tmp);
            tmp.s = t;
            g[s].push_back(tmp);

        }

        spfa(ss,tt);


	}
	return 0;
}


這和discuss裏的那位比較像,但是我已經把我之前的代碼改的面目全非了, 本來是有個compare的方法的,目的是去掉起點和終點相同的情況。

但是它給了個OLE, 刪掉compare就沒了。。。。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章