日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

2018南京网络赛L题 Magical Girl Haze(分层图+优先队列优化的dijkstra)

發布時間:2024/10/14 编程问答 89 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。