LOJ1099來回次短路

2021-07-05 04:58:44 字數 1454 閱讀 9059

思路:求從s->t的次短路,不同的是,每條路是可以重複走的;那麼在更新的時候就要注意下了;

可以設dis[i][0] 是s->i 的當前最短路,dis[i][1]是s->i的當前次短路;然後用優先佇列維護這個性質;

typedef pairii;

queueque;//小的優先

node u = que.top();

que.pop();

u.first + w可以更新s->i的當前最短路權的話,也能改變s->i的當前次短路權,同時更新,然後加入佇列;

u.first + w只能更新當前次短的話,就只更新次短,然後介入佇列;

題目鏈結

/*****************************************

author :crazy_ac(jamesqi)

time :

file name :

*****************************************/

#include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std;

#define fill(a,b) memset(a,b,sizeof a)

#define clr(a) memset(a,0,sizeof a)

#define mk make_pair

templateinline t get_max(const t&a,const t&b)

templateinline t get_min(const t&a,const t&b)

const int inf = 0x3f3f3f3f;

const int maxn = 5555;

const int maxm = 555555;

struct edge

}e[maxm];

typedef pairii;

int head[maxn],n,m,e_cnt;

int dis[maxn],length[maxn];//最短,次短

inline void add_edge(int u,int v,int w)

int dijkstra()

else if (dis[v] != tmp.first + w && tmp.first + w < length[v])

// printf("length[%d] = %d\n",v,length[v]);

} }return length[n];

}int main()

printf("case %d: %d\n",++icase,dijkstra());

} return 0;

}

sdnu1099 字首判斷

1099.字首判斷 time limit 1000 ms memory limit 32768 kb total submission s 421 accepted submission s 58 description 給定 n 個字串,求有多少字串是其他字串的字首。input 第一行為乙個整數n...

ZJUT1099 最少攔截系統

沒想到越來越順手 之前一直看別人做這道題,自己卻沒什麼idea。沒想到今天寫了一下,只測試了幾組資料,連修改都沒有就一次ac,而且time 9ms,memory 208k。值得慶幸一下 不過還是要繼續努力。昨天訂的演算法導論沒想到今天就到手了,很是快。贊一下 之後還要好好加油啊!這道題的ac率不高,...

hdu 1099 不可摸數

題目描述 description s n 是正整數n的真因子之和,即小於n且整除n的因子和.例如s 12 1 2 3 4 6 16.如果任何 數m,s m 都不等於n,則稱n為不可摸數.input 包含多組資料,首先輸入t,表示有t組資料.每組資料1行給出n 2 n 1000 是整數。output ...