1. 程式人生 > >Dijkstra 堆優化 鄰接表存圖

Dijkstra 堆優化 鄰接表存圖

#include<bits/stdc++.h>
using namespace std;

vector<int>vec[105],val[105];
int n,m;
int dis[105];
bool vis[105];
int path[105];
#define inf 0x3f3f3f3f

int main(){
    int x,y,v;
    cin>>n>>m;//n邊 m點
    for(int i=1;i<=n;i++){
        cin>>x>>y>>v;
        vec[x].push_back(y);
        val[x].push_back(v);
        vec[y].push_back(x);
        val[y].push_back(v);
    }
    int st,en;
    memset(dis,inf,sizeof(dis));
    cin>>st>>en;
    while(vec[])




    return 0;
}
/*
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;  
  
const int MAXN = 1e5 + 10;  
const LL INF = 1LL<<62; 
 
vector<int> e[MAXN];//點 
vector<int> w[MAXN];//權 
bool vis[MAXN];
LL dis[MAXN];//距離 
int prev[MAXN];//記錄路徑 
int n,m;//點數和邊數 
struct node
{
	LL d;//儲存距離 
	int u;//點的標號 
	bool operator<(const node & rhs) const
	{
		return d>rhs.d;//距離短的優先 
	}
};
 
 
 
void dij()
{
	priority_queue<node> q;//優先佇列 
	for(int i=1;i<=n;i++)
	{
		dis[i]=INF;//距離初始化 
	}
	dis[1]=0;//出發點的距離設定為1 
	memset(vis,0,sizeof(vis));//初始化 
	node tn;
	tn.d=0;//出發點的距離為0 
	tn.u=1;//出發點為1 
	q.push(tn);//入佇列 
	while(!q.empty())//佇列為空說明已經遍歷完了地圖 
	{
		node t=q.top();//出佇列(最短的出) 
		q.pop();
		int u=t.u;
		if(vis[u]) continue;//判斷是否訪問過 
		vis[u]=true;//訪問後標記 
		for(int i=0;i<e[u].size();i++)
		{
			 int v = e[u][i]; 
		     if(dis[v]>dis[u]+w[u][i])
			{
				dis[v]=dis[u]+w[u][i];//擇優選擇 
				prev[v]=u;//記錄路徑 
				tn.d=dis[v];//記錄距離 
				tn.u=v;//設定跳板 
				q.push(tn);//跳板入佇列 
			}	
		}
		
	}
}
//vector<int> getpath(int t)//路徑還原 
//{
//	vector<int> path;
//	for(;t!=-1;t=prev[t])
//	{
//		path.push_back(t);
//	}
//	reverse(path.begin(),path.end());
//	return path;
// } 
 int main()
 {
 	cin>>n>>m;
 	for(int i=1;i<=n;i++)
 	{
 		e[i].clear();
 		w[i].clear();
	}
	int a,b,c;
	for(int i=1;i<=m;i++)
	{
		cin>>a>>b>>c;
		e[a].push_back(b);
		w[a].push_back(c);
		e[b].push_back(a);
		w[b].push_back(c);
	}
	dij();
	if(dis[n]==INF) cout<<"-1"<<endl;
	else
	{
		e[1].clear();
		e[1].push_back(n);
		while(prev[n]!=1)
		{
			n=prev[n];
			e[1].push_back(n);
		}
		e[1].push_back(1);
		for(int i=e[1].size()-1;i>0;i--)
		{
			cout<<e[1][i]<<" ";
		}
		cout<<e[1][0]<<endl;
	}
	return 0;
 }
 
*/