2018南京网络赛L题 Magical Girl Haze(分层图+优先队列优化的dijkstra)
使用優先隊列優化過的dijkstra時間復雜度可以達到O(v*logn),還是很快的。
#include <iostream>?? ??? ??? ??? ?//最好是用long long 類型的。?
#include <cstring>
#include <queue>?
using namespace std;
typedef long long ll;
const int maxe=2e5+7;
const int maxv=1e5+7;
int n,m,k,con=0;
ll dis[maxv*12+7];
ll head[maxv*12+7];
int vis[maxv*12+7];
struct node?? ??? ??? ??? ??? ??? ?//以邊為重點。?
{
?? ?int u,v,value,next;
?? ?node (int u=0,int v=0,int value=0,int next=0):u(u),v(v),value(value),next(next){}
}e[2*maxe*12+7]; ?? ??? ?
struct Node?
{
?? ?int id;
?? ?ll value;
?? ?Node(int id,ll value):id(id),value(value){} ?//結構體是和普通的數據差不多。直接寫上就能用吧。?
?? ?bool operator < (const Node &a)const?? ? ? ? ? ?? ??? ?//優先隊列按照從小到大的順序輸出。?
?? ?{
?? ??? ?return value>a.value ;?? ?
?? ?}?? ?
};?
void addedge(int u,int v,int value) ?//唯有結構體數組才可以進行模擬鏈表。?
{
?? ?e[con]=node(u,v,value,head[u]);
?? ?head[u]=con++;
}
void dig()
{
?? ?priority_queue< Node >q;
?? ?q.push( Node(1,0));
?? ?dis[1]=0;
?? ?vis[1]=1;
?? ?Node temp(0,0) ;?? ??? ??? ? ? ? ? ? ?? ?//之后進行驗證結構體和類之間的關系。?
?? ?while(!q.empty())
?? ?{
?? ??? ?temp=q.top();
?? ??? ?q.pop();
?? ??? ?int u=temp.id ;
?? ??? ?vis[u]=1;
?? ??? ?for(int i=head[u];~i;i=e[i].next ) ? //但是到下一個點的距離確是可以進行優化的。?
?? ??? ?{?
?? ??? ??? ?ll v=e[i].v ;
?? ??? ??? ?if( vis[ v ]==1 )continue;
?? ??? ??? ?if( temp.value ? + e[i].value <dis[ v ] ?) ? ? ? ? ? ?//此時的距離嗎。 ?
?? ??? ??? ?{
?? ??? ??? ??? ?dis[ v ]= temp.value ?+e[i].value ;?? ??? ?//最為重要的入隊沒有考慮啊。?
?? ??? ??? ? ?? ?q.push( Node( v,dis[v] ) );
?? ??? ??? ?}?? ?
?? ??? ?}
?? ?}
}
int main()
{
?? ?int T;
?? ?scanf("%d",&T);
?? ?while(T--)
?? ?{
?? ??? ?con=0;?? ??? ? ? ? ? ??? ?//一定不要忘了進行初始化的啊。這里是很重要的。?
?? ??? ?memset(head,-1,sizeof(head));
?? ??? ?memset(dis,125,sizeof(dis));
?? ??? ?memset(vis,0,sizeof(vis));
?? ??? ?scanf("%d %d %d",&n,&m,&k);
?? ??? ?int u,v,value;
?? ??? ?for(int i=0;i<m;i++) ?//因為要建立分層圖,所以存儲圖的數組的長度應該是(2*maxe*(k+2));?
?? ??? ?{
?? ??? ??? ?scanf("%d %d %d",&u,&v,&value);?
?? ??? ??? ?for(int j=0;j<=k;j++)
?? ??? ??? ?{
?? ??? ??? ??? ?addedge( u+n*j,v+n*j,value );?? ?
?? ??? ??? ??? ?if(j!=k)
?? ??? ??? ??? ??? ?addedge(u+n*j,v+n*(j+1),0); ? ?//建立層與層之間的關聯。?
?? ??? ??? ?}?? ?
?? ??? ?}
?? ??? ?dig();
?? ??? ?ll ans=9042521604759584125;
?? ??? ?for(int i=0;i<=k;i++)
?? ??? ??? ?if(dis[n+n*i]<ans)
?? ??? ??? ??? ?ans=dis[n+n*i];
?? ??? ?printf("%lld\n",ans);?? ?
?? ?}?? ??
?? ?return 0;?? ?
}?
總結
以上是生活随笔為你收集整理的2018南京网络赛L题 Magical Girl Haze(分层图+优先队列优化的dijkstra)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Dijkstra算法实现
- 下一篇: Four-tuples (2018山东省