数据结构图最短路径基本程序

来源:互联网 发布:劳务派遣公司软件 编辑:程序博客网 时间:2024/05/29 18:54
/*#include<stdio.h>
#include<vector>
using namespace std;
struct E{
int next;
int c;
};
vector<E>edge[101];
bool mark[101];
int Dis[101];
int main(){
int n,m;
while(scanf("%d%d",&n,&m)!=EOF){
if(n==0&&m==0) break;
for(int i=0;i<n;i++) edge[i].clear();
while(m--){
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
E tmp;
tmp.c=c;
tmp.next=b;
edge[a].push_back(tmp);
tmp.next=a;
edge[b].push_back(tmp);
}
while(n--){
int s;
scanf("%d",&s);
}
for(int i=0;i<n;i++){
Dis[i]=-1;
mark[i]=false;
}
Dis[0]=0;
mark[0]=true;
int newp=0;
for(int i=0;i<n-1;i++){
for(int j=0;j<edge[newp].size();j++){
int t=edge[newp][j].next;
int c=edge[newp][j].c;
if(mark[t]==true) continue;
if(Dis[t]==-1||Dis[t]>Dis[newp]+c){
Dis[t]=Dis[newp]+c;
}
}
int min=123123123;
for(int j=0;j<n;j++){
if(mark[j]==true) continue;
if(Dis[j]==-1) continue;
if(Dis[j]<min){
min=Dis[j];
newp=j;
}
}
mark[newp]=true;
}
printf("%d\n",Dis[n-1]);
}
}*/
//1题目1100:最短路径
/*#include<stdio.h>
int ans[1010][1010];
int main(){
int n,m,a,b;
int A[502];
A[0]=1;
for(int i=1;i<501;i++){
A[i]=A[i-1]*2%100000;
}
    while(scanf("%d%d",&n,&m)!=EOF){
    for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
ans[i][j]=-1;
}
ans[i][i]=0;
}
for(int i=0;i<m;i++){
scanf("%d%d",&a,&b);
if(ans[a][b]==-1)  ans[a][b]=ans[b][a]=A[i];
else continue;
}
for(int k=0;k<n;k++){
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(ans[i][k]==-1||ans[k][j]==-1) continue;
if(ans[i][j]==-1||ans[i][k]+ans[k][j]<ans[i][j]){
ans[i][j]=ans[i][k]+ans[k][j];
}
}
}
}
for(int i=1;i<n;i++){
if(ans[0][i]!=-1) 
printf("%d\n",ans[0][i]%100000);
else printf("-1\n");
}  
    }  
}*/


/*#include<stdio.h>
#include<vector>
using namespace std;
struct E{
int next;
int c;
int cost;
};
vector<E>edge[1001];
int Dis[1001];
int cost[1001];
bool mark[1001];
int main(){
int n,m;
int S,T;
while(scanf("%d%d",&n,&m)!=EOF){
if(n==0&&m==0) break;
for(int i=1;i<=n;i++) edge[i].clear();
while(m--){
int a,b,c,cost;
scanf("%d%d%d%d",&a,&b,&c,&cost);
E tmp;
tmp.c=c;
tmp.cost=cost;
tmp.next=b;
edge[a].push_back(tmp);
tmp.next=a;
edge[b].push_back(tmp);
}
scanf("%d%d",&S,&T);
for(int i=1;i<=n;i++){
Dis[i]=-1;
mark[i]=false;
}
Dis[S]=0;
mark[S]=true;
int newp=S;
for(int i=1;i<n;i++){
for(int j=0;j<edge[newp].size();j++){
int t=edge[newp][j].next;
int c=edge[newp][j].c;
int co=edge[newp][j].cost;
if(mark[t]==true)  continue;
if(Dis[t]=-1||Dis[t]>Dis[newp]+c||Dis[t]==Dis[newp]+c&&
 cost[t]>cost[newp]+co){
  Dis[t]=Dis[newp]+c;
  cost[t]=cost[newp]+co; 
 }
}
int min=123123123;
for(int j=1;j<=n;j++){
if(mark[j]==true)  continue;
if(Dis[j]==-1)  continue;
if(Dis[j]<min){
min=Dis[j];
newp=j;
}
}
mark[newp]=true;
}
printf("%d %d\n",Dis[T],cost[T]);
}
return 0;
}*/








//need, 
#include<stdio.h>
#include<vector>
using namespace std;
struct E{
int next;
int c;
};
vector<E>edge[101];
bool mark[101];
int Dis[101];
int main(){
int n,m;
while(scanf("%d%d",&n,&m)!=EOF){
if(n==0&&m==0) break;
for(int i=1;i<=n;i++) edge[i].clear();
while(m--){
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
E tmp;
tmp.c=c;
tmp.next=b;
edge[a].push_back(tmp);
tmp.next=a;
edge[b].push_back(tmp);
}
int x[101];
for(int i=1;i<=n;i++){
scanf("%d",&x[i]);
}
for(int i=1;i<=n;i++){
if(x[i]==2){
for(int j=0;j<edge[i].size();j++){
{
if(x[edge[i][j].next]==1)
edge[i][j].c=0;

}
}
}

for(int i=1;i<=n;i++){
Dis[i]=-1;
mark[i]=false;
}
Dis[1]=0;
mark[1]=true;
int newp=1;
for(int i=1;i<n;i++){
for(int j=0;j<edge[newp].size();j++){
int t=edge[newp][j].next;
int c=edge[newp][j].c;
if(mark[t]==true) continue;
if(Dis[t]==-1||Dis[t]>Dis[newp]+c){
Dis[t]=Dis[newp]+c;
}
}
int min=123123123;
for(int j=1;j<=n;j++){
if(mark[j]==true) continue;
if(Dis[j]==-1) continue;
if(Dis[j]<min){
min=Dis[j];
newp=j;
}
}
mark[newp]=true;
}
if(Dis[2]!=-1)
printf("%d\n",Dis[2]);
else printf("-1\n");
}
}


/*#include<stdio.h>
#include<vector>
using namespace std;
struct E{
int next;
int c;
};
vector<E>edge[101];
bool mark[101];
int Dis[101];
int main(){
int n,m;
while(scanf("%d%d",&n,&m)!=EOF){
if(n==0&&m==0) break;
for(int i=1;i<=n;i++){
edge[i].clear();
}
while(m--){
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
E tmp;
tmp.c=c;
tmp.next=b;
edge[a].push_back(tmp);
tmp.next=a;
edge[b].push_back(tmp);
}
for(int i=1;i<=n;i++){
Dis[i]=-1;
mark[i]=false;

Dis[1]=0;
nark[1]=true;
int newP=1;
for(int i=1;i<n;i++){
for(int j=0;j<edge[newP].size();j++){
int t=edge[newP][j].next;
int c=edge[newP][j].c;
if(mark[t]==true) continue;
if(Dis[t]==-1||Dis[t]>Dis[newP]+c)
  Dis[t]=Dis[newP]+c;
}
int min=1231213123;
for(int j=1;j<=n;j++){
if(mark[j]==true) continue;
if(Dis[j]==-1) continue;
if(Dis[j]<min){
min=Dis[j];
newP=j;
}
}
mark[newP]=true;
}
printf("%d\n",Dis[n]);
}
return 0;
}






int main() {
int n,m;
while(scanf("%d%d",&n,&m)!=EOF){
if(n==0&&m==0) break;
for(int i=1;i<=n;i++){
edge[i].clear();
}
while(m--){
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
E tmp;
tmp.c=c;
tmp.next=b;
edge[a].push_back(tmp);
tmp.next=a;
edge[b].push_back(tmp);
}
for(int i=1;i<=n;i++){
Dis[i]=-1;
mark[i]=false;
}
Dis[1]=0;
mark[1]=true;
int newp=1;
for(int i=1;i<n;i++){
for(int j=0;j<edge[newp].size();j++){
 int t=edge[newp][j].next;
 int c=edge[newp][j].c;
 if(mark[t]==true) continue;
 if(Dis[t]==-1||Dis[t]>Dis[newp]+c)
    Dis[t]=Dis[newp]+c;
}
}
int min=123123123;
for(int j=1;j<=n;j++){
if(mrak[j]==true) continue;
if(Dis[j]==-1)  continue;
if(Dis[j]<min){
min=Dis[j];
newp=j;
}
} mark[newp]=true;

}printf("%d\n",Dis[n]);

}




*/
/*
#include<stdio.h>
#include<vector>
using namespace std;
struct E{
int next;
int c;
int cost;
}; 
vector<E>edge[1001];
int Dis[1001];
int cost[1001];
bool mark[1001];
int main()
{
int n,m;
int S,T;
while(scanf("%d%d",&n,&m)!=EOF){
if(n==0&&m==0) break;
for(int i=1;i<=n;i++){
edge[i].clear();
}
while(m--){
int a,b,c,cost;
scanf("%d%d%d%d",&a,&b,&c,&cost);
E tmp;
tmp.c=c;
tmp.cost=cost;
tmp.next=b;
edge[a].push_back(tmp);
tmp.next=a;
edge[b].push_back(tmp);
}
scanf("%d%d",&S,&T);
for(int i=1;i<=n;i++){
Dis[i]=-1;
mark[i]=false;
}
Dis[S]=0;
mark[S]=true;
int newp=s;
for(int i=1;i<n;i++){
for(int j=1;j<edge[newp].size();j++){
int t=edge[newp][j].next;
itn c=edge[newp][j].c;
int co=edge[newp][j].cost;
if(mark[t]==true) continue;
if(Dis[t]==-1||Dis[t]>Dis[newp]+c||Dis[t]==Dis[newp]+c
&&cost[t]>cost[newp]+co){
Dis[t]=Dis[newp]+c;
cost[t]=cost[newp]+co;
}
}
int min=123123123;
for(int j=1;j<=n;j++){
if(mark[j]==true) continue;
if(Dis[j]==-1) continue;
if(Dis[j]<min){
min=Dis[j];
newp=j;
}
}
mark[newp]=true;
}
printf("%d %d\n",Dis[T],cost[T]);
}
return 0;
}
*/
/*
#include<stdio.h>
int ans[101][101];
int main(){
int n,m;
while(scanf("%d%d",&n,&m)!=EOF){
if(n==0&&m==0)break;
for(int i=0;i<=n;i++){
for(int j=1;j<=n;j++){
ans[i][j]=-1;
}
ans[i][i]=0;
}
while(m--){
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
ans[a][b]=ans[b][a]=c;
}
for(int k=1;k<=n;k++){
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(ans[i][k]==-1||ans[k][j]==-1) continue;
if(ans[i][j]==-1||ans[i][k]+ans[k][j]<ans[i][j])
   ans[i][j]=ans[i][k]+ans[k][j]; 
}
}
}
printf("%d\n",ans[1][n]); 
}
}
*/
1 0
原创粉丝点击